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

C# 在C中将嵌入式资源作为文件复制到磁盘#,c#,embedded-resource,C#,Embedded Resource,在我的C#项目中,我有一个作为嵌入式资源保存的INF文件。我正在尝试按需将此文件保存到本地位置。我正在使用这种方法 public static void SaveResourceToDisk(string ResourceName, string FileToExtractTo) { Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream(ResourceName); FileStream reso

在我的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;
}
当我尝试调用此方法(将资源名称与命名空间名称一起传递)时,会出现以下错误:

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

我做错什么了?

你可以打电话给我

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
并检查哪些嵌入式资源是可访问的。然后你可以将其与你正在传递的内容进行比较,看看你是否真的实现了你所期望的

也应该考虑使用关键字来处理流:

using(FileStream ResourceFile = new FileStream(FileToExtractTo, FileMode.Create))
{
    //do stuff
}

祝你好运。

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

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

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

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;
        }
    }
}
公共类嵌入资源
{
private bool IsUnpacket=假;
公共异步任务EnsureUnpacked(字符串保存目录)
{
如果(!this.isunpackage)
{
var assembly=assembly.getExecutionGassembly();
var assemblyDirectory=Path.GetDirectoryName(assembly.Location);
foreach(assembly.GetManifestResourceNames()中的变量名)
{
var stream=assembly.GetManifestResourceStream(名称);
var stringBuilder=新的stringBuilder();
var parts=名称
.Replace(typeof(EmbeddedResources).Namespace+”,string.Empty)
.Split(“.”)
.ToList();
对于(int i=0;i
将文件附加到项目中。单击附件。转到属性,将生成操作设置为嵌入式资源,在代码中使用文件名,如:“YourProjectName.YourFileNameIWithExt”

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

因此,我只需向用户请求一个保存路径,然后使用
System.IO.File.writealBytes


如果你发布了完整的错误(包括行号,与你的代码中的行号匹配),它可能有助于诊断这个问题。一个小贴士:考虑使用“使用”关键字与你的对象自动处理它们。重复的,它有一个更有用的代码示例。好,得到它。我当时正在使用
GetManifestResourceStream(namespace.resourcename)
,而我本应该使用
GetManifestResourceStream(namespace.Resources.resourcename)
。感谢您使用
提示!
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);
}