这里的想法是从嵌入式资源中提取一个批处理文件到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];
如果你嵌入了资源,那么它会生成静态方法来获取嵌入文件内容的内容,内部它调用ResourceManager.GetString
方法,所以在下面试试
using (var sw = new BinaryWriter(File.Open(@"C:test.bat", FileMode.OpenOrCreate)))
{
writer.Write(Namespace.Properties.Resources.Backup);
}
听起来流没有返回或者没有报告长度。
此外,不要一次读取整个流,这不是很有内存效率,当你开始使用网络流或大型文件时,也不是最好的模式,因为这些文件可能实际上没有报告它们的实际长度。
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);
}
}
}
以下内容对您来说如何?
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);
}
}
}
}
}