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.
GFU-Schulungen  [Anzeige]

XML und .NET Überblick

Um auf dem neuesten Wissensstand zu sein, sollten Sie unser aktuelles ASP .NET Komplett Seminar belegen.
Nach dem Seminar kennen Sie die wichtigsten Strömungen in der Software-Technologie

ASP.NET Core - Der Einstieg

In nur 3 Tagen lernen Sie, wie man mit ASP.NET Core und den Technologien MVC, Entity Framework, WebAPI und Razor professionelle Web-Anwendungs-Architekturen aufbaut. Diese Schulung ist der perfekte Einstieg, um datengetriebene und präsentations-orientierte Applikationen auf Basis der ASP.NET Core Plattform zu erstellen.

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!