Feedback

C# - Text Resourcen aus Assembly auslesen

Veröffentlicht von am 06.12.2008
(1 Bewertungen)
Klasse zum Auslesen von Textdateien aus einer Assembly. Zusätzlich kann eine Liste aller Resourcen abgefragt werden.
Snippet in VB übersetzen
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.IO;

namespace Softwareküche.Common
{
    /// <summary>
    /// Klasse zum Zugriff auf Resourcen innerhalb der DLL.
    /// </summary>
    internal static class ResourceReader
    {
        #region Konsturktor

        private static List<String> _resources;
        private static Assembly _assembly;

        /// <summary>
        /// Initialisieren der Liste mit den Resourcen
        /// </summary>
        static ResourceReader()
        {
            // Lesen und sortieren der Resourcen
            _resources = new List<String>();
            _assembly = Assembly.GetCallingAssembly();
            _resources.AddRange(_assembly.GetManifestResourceNames());
            _resources.Sort();
        }

        #endregion

        #region Eingebettete Resourcen auflisten

        /// <summary>
        /// Listet alle Resourcen mit dem angegebenen Filter zurück
        /// </summary>
        /// <param name="pattern">Muster, für das die Resourcen gefilter werden</param>
        /// <remarks>
        /// Unterstützte Filter:
        /// Exakte: foo
        /// EndsWith: *foo
        /// Starts With: foo*
        ///</remarks>
        public static string[] GetResourceList(string pattern)
        {
            if (String.IsNullOrEmpty(pattern)) return _resources.ToArray();

            string[] parts = pattern.Split(''*'');

            // Exakten String suchen
            if (parts.Length == 1)
            {
                foreach (string s in _resources)
                {
                    if (string.Compare(s, parts[0], false) == 0) return new string[] { s };
                }

                return (new List<String>()).ToArray();
            }
            // Anfang oder Ende ist gegeben *xxx oder yyy*
            else if (parts.Length == 2)
            {
                List<String> res = new List<string>();

                foreach (string s in _resources)
                {
                    if (s.StartsWith(parts[0]) && s.EndsWith(parts[1])) res.Add(s);
                }

                return res.ToArray();
            }
            else
            {
                throw new NotImplementedException("Mehr als ein ''*'' ist derzeit nicht implementiert");
            }
        }

        #endregion

        #region String Reader

        /// <summary>
        /// Liest einen Stream bis ans Ende aus und gibt die enthaltenen Daten zurück.
        /// </summary>
        /// <param name="stream">Der Stream, der bis zum Ende gelesen werden soll</param>
        /// <returns>Inhalt des Streams</returns>
        private static string ReadStreamToEnd(Stream stream)
        {
            try
            {
                byte[] data = new byte[(int)stream.Length];
                int size = stream.Read(data, 0, data.Length);

                return Encoding.Default.GetString(data, 0, size);
            }
            catch (Exception ex)
            {
                // Fehler mit einer eigenen Fehlerklasse kapseln
                throw new Exception("Fehler beim Auslesen der Resource in eine Zeichenkette", ex);
            }
        }

        /// <summary>
        /// Liste eine String Resource aus der Assembly aus
        /// </summary>
        /// <param name="resourceName">Name der Resource</param>
        public static string GetStringResource(string resourceName)
        {
            try
            {
                Stream stream = _assembly.GetManifestResourceStream(resourceName);
                return ReadStreamToEnd(stream);
            }
            catch (Exception ex)
            {
                // Vermeiden verschachtelter "Exceptions"
                throw new PException(ex.Message + Environment.NewLine + "Die Resource ''" + resourceName + "'' konnte nicht gelesen werden.", ex.InnerException);
            }
            catch (Exception ex)
            {
                // Exception geschachtelt neu werfen
                throw new Exception("Die Resource ''" + resourceName + "'' konnte nicht gelesen werden.", ex);
            }
        }

        #endregion
    }
}
Abgelegt unter Embedded, Eingebettet, Text, SQL, Resource, Ressource.

1 Kommentare zum Snippet

ThomasMentzel schrieb am 07.12.2008:
Hier noch ein bißchen Code für den ResourceReader


string[] resList; // Liste aller Resourcen
resList = ResourceReader.GetResourceList("*.init.sql");

foreach (string res in resList)
{
string sql; // Inhalt der Resource (hier ein SQL Script)
sql = ResourceReader.GetStringResource(res);
DBBase.ExecuteProcedure(sql); // Ausführen des SQL
}
 

Logge dich ein, um hier zu kommentieren!