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