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

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

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关键字来处理您的流:

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