我在我的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;
}
当我尝试调用此方法(传递资源名称和命名空间名称)时,我收到错误:
对象引用未设置为对象的实例
我在这里做错了什么?
答案 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);
}