2010-12-10 7 views
7

C# projemde gömülü bir kaynak olarak kaydedilmiş bir INF dosyasına sahibim. Bu dosyayı talep üzerine yerel bir yere kaydetmeye çalışıyorum. Bu yöntemi kullanıyorum.Katıştırılmış kaynağı C olarak dosyaya kopyalamak için C#

Object reference not set to an instance of an object

burada yanlış yapıyorum:

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; 
} 

ben bu yöntemi (ad adı ile birlikte kaynak adını geçirmeden) aramak için denemek , ben hata alıyorum?

+0

Dolu hatayı (kodunuzdaki satır numarasına karşılık gelen satır numarası dahil) gönderdiyseniz, bu sorunu tanılamanıza yardımcı olabilir. –

+2

Bir yan ipucu: Otomatik olarak atmak için nesnelerinizle "kullanma" anahtar sözcüğünü kullanmayı düşünün. –

+2

Daha kullanışlı bir kod örneği olan http://stackoverflow.com/questions/864140/write-file-from-assembly-resource-stream-to-disk dosyasının kopyası. – pennyrave

cevap

9

Sen

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

diyoruz Ve gömülü kaynaklar erişilebilir olan Denetleme yapabiliriz. Öyleyse, ne beklediğinize gerçekten ulaşıp ulaşmadığınızı görmek için, öyleyken neye karşı çıktığınızı karşılaştırabilirsiniz.

Ayrıca size akışları bertaraf etmek kullanarak anahtar kelimeyi düşünmelisiniz:

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

İyi şanslar.

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

Tamam, anladım. GetManifestResourceStream (namespace.resourcename) 'i kullanmam gerektiğinde' GetManifestResourceStream (namespace.Resources.resourcename) 'kullanıyordum. Ve 'using' ucu için teşekkürler! – GPX

4

Bu gömülü bir kaynak kaydetmek için en kolay yoludur. Bu kod, derleme içerisindeki dosyalar hakkında herhangi bir şey bilmenizi gerektirmez ve daha genel bir çözümdür, ancak tüm dosyaların dosya uzantılarına sahip olduğunu varsayar.

public class EmbeddedResources 
{ 
    private bool isUnpacked = false; 

    public async Task EnsureUnpacked(string saveDirectory) 
    { 
     if (!this.isUnpacked) 
     { 
      var assembly = Assembly.GetExecutingAssembly(); 
      var assemblyDirectory = Path.GetDirectoryName(assembly.Location); 
      foreach (var name in assembly.GetManifestResourceNames()) 
      { 
       var stream = assembly.GetManifestResourceStream(name); 

       var stringBuilder = new StringBuilder(); 
       var parts = name 
        .Replace(typeof(EmbeddedResources).Namespace + ".", string.Empty) 
        .Split('.') 
        .ToList(); 
       for (int i = 0; i < parts.Count; ++i) 
       { 
        var part = parts[i]; 
        if (string.Equals(part, string.Empty)) 
        { 
         stringBuilder.Append(".");  // Append '.' in file name. 
        } 
        else if (i == parts.Count - 2) 
        { 
         stringBuilder.Append(part);  // Append file name and '.'. 
         stringBuilder.Append('.'); 
        } 
        else if (i == parts.Count - 1) 
        { 
         stringBuilder.Append(part);  // Append file extension. 
        } 
        else 
        { 
         stringBuilder.Append(part);  // Append file path. 
         stringBuilder.Append('\\'); 
        } 
       } 

       var filePath = Path.Combine(saveDirectory, stringBuilder.ToString()); 
       using (FileStream fileStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) 
       { 
        await stream.CopyToAsync(fileStream); 
       } 
      } 

      this.isUnpacked = true; 
     } 
    } 
} 
0

bir montaj içindeki tüm gömülü kaynaklar Unpacks ve dizin yapısını koruyarak bu sınıfı içeren montaj yanında kaydeder: