C# 在C中将嵌入式资源作为文件复制到磁盘#
在我的C#项目中,我有一个作为嵌入式资源保存的INF文件。我正在尝试按需将此文件保存到本地位置。我正在使用这种方法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
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);
}