在C#中将嵌入式资源作为文件复制到磁盘

时间:2010-12-10 04:58:46

标签: c# embedded-resource

我在我的C#项目中将INF文件保存为嵌入式资源。我试图按需将此文件保存到本地位置。我正在使用这种方法。

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

当我尝试调用此方法(传递资源名称和命名空间名称)时,我收到错误:

  

对象引用未设置为对象的实例

我在这里做错了什么?

5 个答案:

答案 0 :(得分:9)

你可以打电话

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

检查哪些嵌入式资源是可访问的。然后你可以将它与你传入的内容进行比较,看看你是否确实完成了你的预期。

此外,您应该考虑使用using关键字来处理您的流:

using(FileStream ResourceFile = new FileStream(FileToExtractTo, FileMode.Create))
{
    //do stuff
}
祝你好运。

答案 1 :(得分:3)

这是保存嵌入资源的最简单方法:

  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();

答案 2 :(得分:1)

解压缩程序集中的所有嵌入资源,并将它们与包含此类的程序集一起保存,同时保持目录结构。此代码不要求您了解有关程序集中包含的文件的任何信息,这是一个更通用的解决方案,但它确实假定所有文件都有文件扩展名。

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

答案 3 :(得分:0)

将文件附加到项目中。单击附加的file.go进入属性,将“构建操作”设置为“嵌入式资源”,在代码中使用文件名,例如:“ YourProjectName.YourFileNameIWithExt”

答案 4 :(得分:0)

我在我的 Resources 中添加了一个 Excel 文件,但使用其他人的解决方案没有运气。这是因为文件本身是通过 byte[] 作为 Properties.Resources 访问的,而不是选择字符串路径路由。

所以我只是询问用户保存路径,然后我使用 System.IO.File.WriteAllBytes method:

using (var save = new SaveFileDialog())
{
    save.Title = "File path for saving the file";
    save.FileName = "Excel file.xlsx";
    save.Filter = "Excel files|*.xlsx;*.xls";
    var dialog = save.ShowDialog();
    if (dialog != DialogResult.OK)
        return;

    System.IO.File.WriteAllBytes(save.FileName, Resources.ExcelFile);
}