Hallo alle zusammen,
ich habe für euch eine Klasse, welche den Umgang mit eingebetteten Ressourcen vereinfachen soll. Als Inspiration diente dieser Thread: [Allgemein] Video im Programm einfügen. Hier ist mir aufgefallen, dass es keinen einheitlichen Weg gibt, Ressourcen abzuspeichern (zum Beispiel muss man für Bilder den Umweg über einen ImageConverter gehen). Über die eingebetteten Ressourcen geht das zwar, allerdings ist die Vorgehensweise nicht so simpel und daher für Anfänger und Leute, welche auf dem Gebiet noch nicht so erfahren sind nicht wirklich geeignet.
Die Klasse löst das Problem, indem sie einen einfachen Weg bietet, Ressourcen zu durchsuchen, den dazugehörigen Stream zu erhalten und abzuspeichern und das mit der eigenen oder sogar mit einer fremden Assembly. Sie ist übersichtlich aufgebaut und alle Methoden sind mit XML-Kommentaren versehen. Das System sollte mit allen Dateitypen zurechtkommen (getestet wurden docx, doc, mp4, flv, png, jpg, pdf, zip, ico und noch ein paar mehr).
Code:
VB (Original)
C#
Klassendiagramm:
Benutzung
Changelog
Version 0.1
Erste funktionsfähige Version
Version 0.2
Kleine Verbesserungen (Danke an ~blaze~ für den Hinweis)
Ich hoffe, dass einigen dieser Code weiterhelfen wird :).
MfG Stefan
ich habe für euch eine Klasse, welche den Umgang mit eingebetteten Ressourcen vereinfachen soll. Als Inspiration diente dieser Thread: [Allgemein] Video im Programm einfügen. Hier ist mir aufgefallen, dass es keinen einheitlichen Weg gibt, Ressourcen abzuspeichern (zum Beispiel muss man für Bilder den Umweg über einen ImageConverter gehen). Über die eingebetteten Ressourcen geht das zwar, allerdings ist die Vorgehensweise nicht so simpel und daher für Anfänger und Leute, welche auf dem Gebiet noch nicht so erfahren sind nicht wirklich geeignet.
Die Klasse löst das Problem, indem sie einen einfachen Weg bietet, Ressourcen zu durchsuchen, den dazugehörigen Stream zu erhalten und abzuspeichern und das mit der eigenen oder sogar mit einer fremden Assembly. Sie ist übersichtlich aufgebaut und alle Methoden sind mit XML-Kommentaren versehen. Das System sollte mit allen Dateitypen zurechtkommen (getestet wurden docx, doc, mp4, flv, png, jpg, pdf, zip, ico und noch ein paar mehr).
Code:
VB.NET-Quellcode
- Imports System.IO
- Imports System.Reflection
- Public Class EmbeddedResourceHelper
- Private _SourceAssembly As Assembly = Nothing
- ''' <summary>
- ''' Die Assembly, welche durchsucht werden soll
- ''' </summary>
- Public Property SourceAssembly As Assembly
- Get
- Return _SourceAssembly
- End Get
- Private Set(value As Assembly)
- _SourceAssembly = value
- End Set
- End Property
- ''' <summary>
- ''' Erstellt einen neuen EmbeddedResourceHelper
- ''' </summary>
- Public Sub New()
- Me.SourceAssembly = Assembly.GetCallingAssembly()
- End Sub
- ''' <summary>
- ''' Erstellt einen neuen EmbeddedResourceHelper
- ''' </summary>
- ''' <param name="assembly">Die Assembly, welche durchsucht werden soll</param>
- Public Sub New(assembly As Assembly)
- Me.SourceAssembly = assembly
- End Sub
- ''' <summary>
- ''' Gibt den zu einer Ressource gehörenden Stream aus
- ''' </summary>
- ''' <param name="fileName">Der Name der Ressource, nach der gesucht werden soll</param>
- ''' <returns>Den zu der Ressource gehörenden Stream</returns>
- Public Function GetStream(fileName As String) As Stream
- Dim AvailableResources = GetResourceNames()
- If AvailableResources.Contains(fileName) Then
- Return SourceAssembly.GetManifestResourceStream(fileName)
- Else
- Dim MatchingResource = AvailableResources.FirstOrDefault(Function(resourcePath) resourcePath.EndsWith(fileName))
- If MatchingResource IsNot Nothing Then
- Return SourceAssembly.GetManifestResourceStream(MatchingResource)
- Else
- Throw New ArgumentException("Ressource wurde nicht gefunden", "fileName")
- End If
- End If
- End Function
- ''' <summary>
- ''' Schreibt eine Ressource in eine Datei
- ''' </summary>
- ''' <param name="fileName">Der Name der Originaldatei</param>
- ''' <param name="outputPath">Der Pfad, in den sie geschrieben werden soll</param>
- Public Function WriteResourceToFile(fileName As String, outputPath As String) As FileInfo
- Using ResourceStream = GetStream(fileName)
- Dim OutputFile As New FileInfo(Path.Combine(outputPath, fileName))
- Using OutputStream = OutputFile.Open(FileMode.Create)
- ResourceStream.CopyTo(OutputStream)
- 'OutputStream.Close()
- End Using
- Return OutputFile
- End Using
- End Function
- ''' <summary>
- ''' Gibt die Namen aller in die Assembly eingebetteten Ressourcen aus
- ''' </summary>
- ''' <returns>Die Namen aller in die Assembly eingebetteten Ressourcen</returns>
- Public Function GetResourceNames() As IEnumerable(Of String)
- Return SourceAssembly.GetManifestResourceNames()
- End Function
- End Class
C-Quellcode
- using System.IO;
- using System.Reflection;
- public class EmbeddedResourceHelper
- {
- private Assembly _SourceAssembly = null;
- /// <summary>
- /// Die Assembly, welche durchsucht werden soll
- /// </summary>
- public Assembly SourceAssembly {
- get { return _SourceAssembly; }
- private set { _SourceAssembly = value; }
- }
- /// <summary>
- /// Erstellt einen neuen EmbeddedResourceHelper
- /// </summary>
- public EmbeddedResourceHelper()
- {
- this.SourceAssembly = Assembly.GetCallingAssembly();
- }
- /// <summary>
- /// Erstellt einen neuen EmbeddedResourceHelper
- /// </summary>
- /// <param name="assembly">Die Assembly, welche durchsucht werden soll</param>
- public EmbeddedResourceHelper(Assembly assembly)
- {
- this.SourceAssembly = assembly;
- }
- /// <summary>
- /// Gibt den zu einer Ressource gehörenden Stream aus
- /// </summary>
- /// <param name="fileName">Der Name der Ressource, nach der gesucht werden soll</param>
- /// <returns>Den zu der Ressource gehörenden Stream</returns>
- public Stream GetStream(string fileName)
- {
- var AvailableResources = GetResourceNames();
- if (AvailableResources.Contains(fileName)) {
- return SourceAssembly.GetManifestResourceStream(fileName);
- } else {
- var MatchingResource = AvailableResources.FirstOrDefault(resourcePath => resourcePath.EndsWith(fileName));
- if (MatchingResource != null) {
- return SourceAssembly.GetManifestResourceStream(MatchingResource);
- } else {
- throw new ArgumentException("Ressource wurde nicht gefunden", "fileName");
- }
- }
- }
- /// <summary>
- /// Schreibt eine Ressource in eine Datei
- /// </summary>
- /// <param name="fileName">Der Name der Originaldatei</param>
- /// <param name="outputPath">Der Pfad, in den sie geschrieben werden soll</param>
- public FileInfo WriteResourceToFile(string fileName, string outputPath)
- {
- using (ResourceStream == GetStream(fileName)) {
- FileInfo OutputFile = new FileInfo(Path.Combine(outputPath, fileName));
- using (OutputStream == OutputFile.Open(FileMode.Create)) {
- ResourceStream.CopyTo(OutputStream);
- //OutputStream.Close()
- }
- return OutputFile;
- }
- }
- /// <summary>
- /// Gibt die Namen aller in die Assembly eingebetteten Ressourcen aus
- /// </summary>
- /// <returns>Die Namen aller in die Assembly eingebetteten Ressourcen</returns>
- public IEnumerable<string> GetResourceNames()
- {
- return SourceAssembly.GetManifestResourceNames();
- }
- }
Klassendiagramm:
Schritt 1, Klasse zum Projekt hinzufügen:
- Projekt > Klasse hinzufügen > Namen geben > Code einfügen
- Projekt > Vorhandenes Element hinzufügen > Datei auswählen
- Datei im Projektmappenexplorer auswählen und in den Eigenschaften den Buildvorgang auf "Eingebettete Ressource" stellen
- Methode 1, Datei abspeichern:
Dafür verwenden wir die MethodeWriteResourceToFile
. Die Benutzung ist einfach, wir geben den Namen der Originaldatei und den Ausgabeordner ein und kriegen eine FileInfo auf die erstellte Datei zurück. Das könnte beispielsweise so aussehen:
Mit der FileInfo, welche wir bekommen haben, können wir jetzt vieles machen, beispielsweise uns den Pfad der Datei daraus holen und sie öffnen:
- Methode 2, Stream holen:
Wir können uns auch den Stream auf die Datei holen, indem wir die FunktionGetStream
verwenden. Das kann zum Beispiel hilfreich sein, wenn man nur den Inhalt der Datei in Textform bekommen möchte:
Aus dem Stream könnte man jetzt beispielsweise den Text auslesen (wenn es eine Textdatei ist) und diesen ausgeben:
Version 0.1
Erste funktionsfähige Version
Version 0.2
Kleine Verbesserungen (Danke an ~blaze~ für den Hinweis)
Ich hoffe, dass einigen dieser Code weiterhelfen wird :).
MfG Stefan
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „nafets3646“ ()