Klasse zum Auslesen von Textdateien aus einer Assembly. Zusätzlich kann eine Liste aller Resourcen abgefragt werden.
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
}
}
1 Kommentare zum Snippet