我想在程序集中嵌入一个文本文件,这样我就可以加载文本而无需从磁盘中读取它,因此我需要的所有东西都包含在exe中。 (这样它更便携)
有办法做到这一点吗?我假设有资源文件?
如果可以的话,你是如何做到的,以及如何将文本加载到字符串中?
答案 0 :(得分:142)
右键单击项目文件,选择“属性”。
在打开的窗口中,转到“资源”选项卡,如果标签页中间只有一个蓝色链接,请单击它以创建新资源。
然后从标签页上方的工具栏中选择添加新文本文件,为其命名,将其添加到项目中并打开。
如果你做到这一点,那么在你的代码中你可以输入Resources.TheNameYouGaveTheTextFileHere并且你可以访问它的内容。请注意,第一次在类中使用Resources类时,需要添加using指令(在按下Ctrl +。键入资源后获取菜单以让VS为您执行此操作)。
如果对上述说明不清楚,请发表评论,我会对其进行编辑,直到完成或有意义为止:)
答案 1 :(得分:38)
在Visual Studio 2003,Visual Studio 2005和可能的早期版本(这也适用于2008)中,您可以在项目中包含文本文件,然后在“属性”面板中将操作设置为“嵌入式资源”。然后,您可以使用Assembly.GetManifestResourceStream(string)
作为流访问该文件。
这里的其他答案更方便。我将此包括在内是为了完整性。
请注意,此方法适用于嵌入其他类型的文件,如图像,图标,声音等...
答案 2 :(得分:30)
嵌入文本文件后,请使用该文件在代码中的任何位置......
global::packageName.Properties.Resources.ThatFileName
答案 3 :(得分:4)
是的,你是对的 - 创建一个资源文件。如果你这样做,你不需要“加载”字符串,它将被引用为Resource.WhateverStringYouDefined。
答案 4 :(得分:1)
这是我做的:
要访问资源:
一个。使用函数GetExecutingAssembly()
湾我添加的资源是一个文本文件,因此我使用GetManifestResourceStream(fileName)
将其读入流中。我访问文件名的方法是调用GetManifestResourceNames()
℃。现在使用StreamReader()
类将文件末尾读入变量,如果这是你想要的。
答案 5 :(得分:1)
这对我有用。 (我需要读取嵌入到可执行.NET图像文件中的文件的内容。)
在执行任何操作之前,请将文件包含在Visual Studio中的解决方案中。 (以我的VS 2017社区为例。)我切换到Solution Explorer
,然后右键单击Properties
文件夹,选择Add Existing Item
并选择了文件。 (假设FileName.txt
。)然后,在仍位于Solution Explorer
中的情况下,右键单击包含的文件,选择Properties
,然后选择Build Action
作为Embedded Resource
。
然后使用此代码读取其字节:
string strResourceName = "FileName.txt";
Assembly asm = Assembly.GetExecutingAssembly();
using( Stream rsrcStream = asm.GetManifestResourceStream(asm.GetName().Name + ".Properties." + strResourceName))
{
using (StreamReader sRdr = new StreamReader(rsrcStream))
{
//For instance, gets it as text
string strTxt = sRdr.ReadToEnd();
}
}
请注意,在这种情况下,您不需要将文件添加为accepted answer中建议的资源。
答案 6 :(得分:0)
添加到Pavan的答案,获取当前程序集(一般部分):
Assembly _assembly;
GetManifestResourceStream(fileName)(在代码中,需要从资源中读取):
try
{
_assembly = Assembly.GetExecutingAssembly();
_textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
Console.WritelLine("Error accessing resource!");
}