129

我想在程序集中嵌入一个文本文件,这样我就可以加载文本而不必从磁盘读取它,并且我需要的所有内容都包含在 exe 中。(这样它更便携)

有没有办法做到这一点?我假设资源文件有什么?

如果可以的话,你是如何做到的,以及如何以编程方式将文本加载到字符串中?

4

7 回答 7

159

右键单击项目文件,选择属性。

在打开的窗口中,转到“资源”选项卡,如果选项卡页面中间只有一个蓝色链接,请单击它以创建新资源。

在此处输入图像描述

然后从标签页上方的工具栏中,选择添加一个新的文本文件,给它一个名字,它将被添加到你的项目中并打开。

如果您做到了这一点,那么您可以在代码中输入 Resources.TheNameYouGaveTheTextFileHere 并访问其内容。请注意,第一次在类中使用 Resources 类时,需要添加 using 指令(在键入 Resources 后按 Ctrl+. 以获取菜单以让 VS 为您执行此操作)。

如果上面的描述有什么不清楚的地方,请发表评论,我会编辑它,直到它完成或有意义:)

于 2009-01-11T16:43:52.183 回答
41

在 Visual Studio 2003、Visual Studio 2005 和可能的更早版本(这在 2008 年也适用)中,您可以在项目中包含文本文件,然后在“属性”面板中,将操作设置为“嵌入式资源”。然后,您可以使用Assembly.GetManifestResourceStream(string).

这里的其他答案更方便。为了完整起见,我将其包括在内。

请注意,此方法适用于嵌入其他类型的文件,例如图像、图标、声音等...

于 2009-01-11T16:50:29.877 回答
33

嵌入文本文件后,在这样的代码中的任何位置使用该文件...

global::packageName.Properties.Resources.ThatFileName
于 2012-07-02T05:35:53.230 回答
5

这对我有用。(我需要读取嵌入到可执行 .NET 映像文件中的文件的内容。)

在执行任何操作之前,请将您的文件包含在 Visual Studio 中的解决方案中。(在我的情况下是 VS 2017 社区。)我切换到Solution Explorer,然后右键单击Properties文件夹,选择Add Existing Item并选择文件。(比如说,FileName.txt。)然后,当仍在 中时Solution Explorer,右键单击包含的文件,选择Properties,然后选择Build Actionas 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();
    }
}

请注意,在这种情况下,您不需要像接受的答案中建议的那样将该文件添加为资源。

于 2018-10-24T07:05:36.570 回答
4

是的,你是对的 - 创建一个资源文件。当您这样做时,您不需要“加载”字符串,它将被引用为 Resource.WhateverStringYouDefined。

于 2009-01-11T16:43:28.423 回答
2

这是我所做的:

  1. 通过右键单击项目在 Visual Studio 中添加了我的文件(资源)。
  2. 右键单击您添加的每个文件并将“构建类型”更改为嵌入式资源。
  3. 为了访问资源:

    一种。使用以下函数获取当前程序集:GetExecutingAssembly()

    湾。我添加的资源是一个文本文件,所以我使用GetManifestResourceStream(fileName). 我访问文件名的方式是调用GetManifestResourceNames()

    C。如果这是您想要的,现在使用一个StreamReader()类将文件末尾读入一个变量。

于 2018-04-12T17:35:53.910 回答
0

添加到 Pavan 的答案,以获得当前的程序集(在一般部分):

Assembly _assembly;

GetManifestResourceStream(fileName)(在代码中,需要从资源中读取):

try
{
    _assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}
于 2018-04-18T12:01:14.100 回答