0

这里的想法是从嵌入式资源中提取批处理文件到 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];
4

3 回答 3

1

如果您嵌入了资源,那么它将生成静态方法来获取嵌入文件内容的内容,在内部它会调用该ResourceManager.GetString方法,因此请尝试以下操作

using (var sw = new BinaryWriter(File.Open(@"C:\test.bat", FileMode.OpenOrCreate)))
{
   writer.Write(Namespace.Properties.Resources.Backup);
}
于 2013-07-19T04:54:51.353 回答
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);
        }
    }
}
于 2013-07-19T06:00:39.577 回答
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);
                        }
                    }
                }

            }
       }
于 2013-07-19T05:59:34.203 回答