从C#应用程序提取嵌入资源时出现问题

本文关键字:问题 嵌入资源 应用程序 提取 | 更新日期: 2023-09-27 18:24:03

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

从C#应用程序提取嵌入资源时出现问题

如果你嵌入了资源,那么它会生成静态方法来获取嵌入文件内容的内容,内部它调用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);
                        }
                    }
                }
            }
       }