2013-07-19 105 views
0

嵌入的资源在这里的想法是从嵌入式资源的批处理文件解压到C盘上的临时目录,然后提取该批处理文件运行。我遇到的问题是“对象引用未设置为对象实例”的错误。有问题提取C#应用程序

的代码是:

public static void ExtractResource() 
    { 
     using (Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream(Namespace.Properties.Resources.Backup)) 
     { 
      byte[] buffer = new byte[s.Length]; 
      s.Read(buffer, 0, buffer.Length); 
      using (var sw = new BinaryWriter(File.Open(@"C:\test.bat", FileMode.OpenOrCreate))) 
      { 
       sw.Write(buffer); 
      } 
     } 
    } 

在此行中出现的错误:

byte[] buffer = new byte[s.Length]; 
+0

根据[doco](http://msdn.microsoft.com/en-us/library/5kx66y1a.aspx)。清单资源;如果在编译期间没有指定资源,或者资源对调用者不可见,则为null。 –

+0

@darkstarohio对这些建议的反馈是什么? –

回答

1

如果你嵌入的资源,然后将生成静态方法来获取嵌入的文件内容的内容,在内部它请拨打ResourceManager.GetString方法,所以请尝试以下方法

using (var sw = new BinaryWriter(File.Open(@"C:\test.bat", FileMode.OpenOrCreate))) 
{ 
    writer.Write(Namespace.Properties.Resources.Backup); 
} 
+0

非常感谢。这个工作的例子。测试。 –

0

为你工作?

public static class Program 
     { 
      public static void Main() 
      { 
       ExtractResource(); 
      } 

      public static void ExtractResource() 
      { 
       //replace your embedded file by yours 
       using (var inputStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ConsoleApplication1.XMLFile1.xml")) 
       { 
        using(var outputStream = File.Create(@"D:\test.bat")) 
        { 
         /// fix your buffer size 8192,4096 etc. 
         var buffer = new byte[8192]; 

         int numberOfBytesRead; 
         while (inputStream != null && (numberOfBytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0) 
         { 
          outputStream.Write(buffer, 0, numberOfBytesread); 
         } 
        } 
       } 

      } 
     } 
0

这听起来像流不返回或它不报告长度。

而且,不看整个的流一次,它不是很高效存储,而不是当你开始使用它实际上可能没有报告其实际长度的网络流或大文件遵循的最佳模式。

public void WriteResrouce(string resourcePath, string targetPath) 
{ 
    var buffer = new byte[64 * 1024]; //i've picked 64k as a reasonable sized block 
    using (Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourcePath)) 
    using (var sw = new BinaryWriter(File.Open(targetPath, FileMode.OpenOrCreate))) 
    { 
     var readCount = -1; 
     while (0 < (readCount = s.Read(buffer, 0, buffer.Length))) 
     { 
      sw.Write(buffer, 0, readCount); 
     } 
    } 
}