我想在程序集中嵌入一个文本文件,这样我就可以加载文本而不必从磁盘读取它,这样我需要的所有东西都包含在 exe 中。(这样便于携带)
有什么办法吗? 我猜是和资源文件有关吧?
如果可以的话,您如何做到这一点,以及如何通过编程将文本加载到字符串中?
是的,你是正确的-创建一个资源文件。当您这样做时,您不需要“加载”字符串,它将被引用为资源。随便你怎么定义。
右键单击项目文件,选择“属性”。
在打开的窗口中,转到 Resources 选项卡,如果该选项卡页面中间只有一个蓝色链接,请单击它,以创建一个新的资源。
然后从选项卡页面上方的工具栏中,选择添加一个新的文本文件,给它一个名称,它将被添加到您的项目中并打开。
如果您已经了解了这么多,那么可以在代码中键入参考资料。TheNameYouGaveTheTextFileHere,你可以访问它的内容。注意,第一次在类中使用 Resources 类时,需要添加 using 指令(单击 Ctrl + 。输入参考资料以获得菜单,然后让 VS 为您完成这项工作)。
如果对上述描述有不清楚的地方,请留下评论,我会编辑它,直到它完整或有意义:)
在 Visual Studio 2003,Visual Studio 2005和可能更早的版本(这在2008年也可以)中,你可以在项目中包含文本文件,然后在“属性”面板中,将操作设置为“嵌入式资源”。然后您可以使用 Assembly.GetManifestResourceStream(string)以流的形式访问该文件。
Assembly.GetManifestResourceStream(string)
这里的其他答案更方便,我包含这个是为了完整。
注意,这种方法可以用于嵌入其他类型的文件,如图像、图标、声音等。
在嵌入一个文本文件之后,像这样在代码的任何地方使用该文件..。
global::packageName.Properties.Resources.ThatFileName
我是这么做的:
为了访问资源:
使用函数 GetExecutingAssembly()得到当前程序集
GetExecutingAssembly()
B.我添加的资源是一个文本文件,因此我使用 GetManifestResourceStream(fileName)将其读入流中。我访问文件名的方法是调用 GetManifestResourceNames()
GetManifestResourceStream(fileName)
GetManifestResourceNames()
C.现在,如果需要的话,可以使用 StreamReader()类将文件读取到变量的末尾。
StreamReader()
对于帕万的答案,获取当前程序集(一般情况下) :
Assembly _assembly;
GetManifestResourceStream (fileName) (在需要从资源读取的代码中) :
try { _assembly = Assembly.GetExecutingAssembly(); _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt")); } catch { Console.WritelLine("Error accessing resource!"); }
以下是对我有用的方法(我需要读取嵌入到可执行.NET 映像文件中的文件的内容)
在执行任何操作之前,请将文件包含到 VisualStudio 中的解决方案中。(在我的案例中 VS 2017社区。)我切换到 Solution Explorer,然后右键单击 Properties文件夹,选择 Add Existing Item并选择该文件。(比如说 FileName.txt)然后,当仍然在 Solution Explorer中时,右键单击包含的文件,选择 Properties,并选择 Build Action作为 Embedded Resource。
Solution Explorer
Properties
Add Existing Item
FileName.txt
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(); } }
注意,在这种情况下,您需要按照 接受的答案中的建议将该文件作为资源添加。