2010-12-10 10 views
7

Ich habe eine INF-Datei als eine eingebettete Ressource in meinem C# -Projekt gespeichert. Ich versuche, diese Datei bei Bedarf an einem lokalen Speicherort zu speichern. Ich benutze diese Methode.Kopieren von eingebetteten Ressourcen als Datei auf Festplatte in C#

public static void SaveResourceToDisk(string ResourceName, string FileToExtractTo) 
{ 
    Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream(ResourceName); 
    FileStream resourceFile = new FileStream(FileToExtractTo, FileMode.Create); 

    byte[] b = new byte[s.Length + 1]; 
    s.Read(b, 0, Convert.ToInt32(s.Length)); 
    resourceFile.Write(b, 0, Convert.ToInt32(b.Length - 1)); 
    resourceFile.Flush(); 
    resourceFile.Close(); 

    resourceFile = null; 
} 

Wenn ich versuche, diese Methode aufzurufen (zusammen mit dem Namespace-Namen den Namen der Ressource vorbei), erhalte ich die Fehlermeldung:

Object reference not set to an instance of an object

Was mache ich falsch hier?

+0

Wenn Sie den vollständigen Fehler (einschließlich Zeilennummer, übereinstimmend mit der Zeilennummer in Ihrem Code) gepostet haben, kann dies bei der Diagnose des Problems hilfreich sein. –

+2

Ein Tipp zur Seite: Verwenden Sie das Schlüsselwort "using" für Ihre Objekte, um sie automatisch zu entfernen. –

+2

Duplikat von http://stackoverflow.com/questions/864140/write-file-from-assembly-resource-stream-to-disk, das ein nützlicheres Codebeispiel enthält. – pennyrave

Antwort

9

könnten Sie rufen

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); 

und prüfen, welche eingebettete Ressourcen zugänglich sind. Dann kannst du das mit dem vergleichen, was du passierst, um zu sehen, ob du wirklich erfüllst, was du erwartest.

Außerdem sollten Sie die Verwendung von Keyword betrachten Ihrer Ströme zu entsorgen:

using(FileStream ResourceFile = new FileStream(FileToExtractTo, FileMode.Create)) 
{ 
    //do stuff 
} 

Viel Glück.

+0

Okay, verstanden. Ich habe 'GetManifestResourceStream (namespace.resourcename)' verwendet, wenn ich 'GetManifestResourceStream (namespace.Resources.resourcename)' usign hätte. Und danke für den 'using' Tipp! – GPX

4

Dies ist der einfachste Weg, um eine eingebettete Ressource zu speichern:

var stream = assembly.GetManifestResourceStream("name of the manifest resourse"); 
    var fileStream = File.Create(@"C:\Test.xml"); 
    stream.Seek(0, SeekOrigin.Begin); 
    stream.CopyTo(fileStream); 
    fileStream.Close(); 
0

entpackt alle eingebetteten Ressourcen innerhalb einer Baugruppe und speichert sie zusammen mit der Montage dieser Klasse enthalten, während die Verzeichnisstruktur beibehalten wird. Dieser Code erfordert nicht, dass Sie etwas über die Dateien in der Assembly wissen, und ist eine allgemeinere Lösung, aber es wird davon ausgegangen, dass alle Dateien Dateierweiterungen haben.

Verwandte Themen