如何读取嵌入的资源文本文件
如何使用 StreamReader 读取嵌入资源(文本文件)并将其作为字符串返回?我当前的脚本使用 Windows 窗体和文本框,允许用户查找和替换未嵌入的文本文件中的文本。
private void button1_Click(object sender, EventArgs e)
{
StringCollection strValuesToSearch = new StringCollection();
strValuesToSearch.Add("Apple");
string stringToReplace;
stringToReplace = textBox1.Text;
StreamReader FileReader = new StreamReader(@"C:\MyFile.txt");
string FileContents;
FileContents = FileReader.ReadToEnd();
FileReader.Close();
foreach (string s in strValuesToSearch)
{
if (FileContents.Contains(s))
FileContents = FileContents.Replace(s, stringToReplace);
}
StreamWriter FileWriter = new StreamWriter(@"MyFile.txt");
FileWriter.Write(FileContents);
FileWriter.Close();
}
How do I read an embedded resource (text file) using StreamReader
and return it as a string? My current script uses a Windows form and textbox that allows the user to find and replace text in a text file that is not embedded.
private void button1_Click(object sender, EventArgs e)
{
StringCollection strValuesToSearch = new StringCollection();
strValuesToSearch.Add("Apple");
string stringToReplace;
stringToReplace = textBox1.Text;
StreamReader FileReader = new StreamReader(@"C:\MyFile.txt");
string FileContents;
FileContents = FileReader.ReadToEnd();
FileReader.Close();
foreach (string s in strValuesToSearch)
{
if (FileContents.Contains(s))
FileContents = FileContents.Replace(s, stringToReplace);
}
StreamWriter FileWriter = new StreamWriter(@"MyFile.txt");
FileWriter.Write(FileContents);
FileWriter.Close();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(24)
您可以使用
程序集.GetManifestResourceStream
方法:添加以下用法
设置相关文件的属性:
参数
Build Action
,值为Embedded Resource
使用以下代码
resourceName
是程序集
中嵌入的资源之一的名称。例如,如果您嵌入一个名为
"MyFile.txt"
的文本文件,该文件位于默认命名空间"MyCompany.MyProduct"
的项目根目录中,则resourceName
是“MyCompany.MyProduct.MyFile.txt”
。您可以使用 获取程序集中所有资源的列表
Assembly.GetManifestResourceNames
方法。仅从文件名中获取
resourceName
(绕过命名空间内容)是一个简单的技巧:完整的示例:
或作为异步扩展方法:
You can use the
Assembly.GetManifestResourceStream
Method:Add the following usings
Set property of relevant file:
Parameter
Build Action
with valueEmbedded Resource
Use the following code
resourceName
is the name of one of the resources embedded inassembly
.For example, if you embed a text file named
"MyFile.txt"
that is placed in the root of a project with default namespace"MyCompany.MyProduct"
, thenresourceName
is"MyCompany.MyProduct.MyFile.txt"
.You can get a list of all resources in an assembly using the
Assembly.GetManifestResourceNames
Method.A no brainer astute to get the
resourceName
from the file name only (by pass the namespace stuff):A complete example:
or as an async extension method:
您可以使用两种不同的方法将文件添加为资源。
访问该文件所需的 C# 代码有所不同,具体取决于最初添加文件所使用的方法。
方法 1:添加现有文件,将属性设置为
Embedded Resource
将文件添加到您的项目,然后将类型设置为
Embedded Resource
。注意:如果您使用此方法添加文件,则可以使用
GetManifestResourceStream
来访问它(请参阅 来自@dtb的回答)。方法2:将文件添加到
Resources.resx
打开
Resources.resx
文件,使用下拉框添加文件,将Access Modifier
设置为public
。注意:如果使用此方法添加文件,则可以使用
Properties.Resources
来访问它(请参阅 @Night Walker 的回答)。You can add a file as a resource using two separate methods.
The C# code required to access the file is different, depending on the method used to add the file in the first place.
Method 1: Add existing file, set property to
Embedded Resource
Add the file to your project, then set the type to
Embedded Resource
.NOTE: If you add the file using this method, you can use
GetManifestResourceStream
to access it (see answer from @dtb).Method 2: Add file to
Resources.resx
Open up the
Resources.resx
file, use the dropdown box to add the file, setAccess Modifier
topublic
.NOTE: If you add the file using this method, you can use
Properties.Resources
to access it (see answer from @Night Walker).基本上,您使用 System.Reflection 来获取对当前程序集的引用。然后,您使用
GetManifestResourceStream()
。例如,来自我发布的页面:
注意:需要添加
using System.Reflection;
才能正常工作Basically, you use
System.Reflection
to get a reference to the current Assembly. Then, you useGetManifestResourceStream()
.Example, from the page I posted:
Note: need to add
using System.Reflection;
for this to work在 Visual Studio 中,您可以通过项目属性的“资源”选项卡(本例中为“分析”)直接嵌入对文件资源的访问。
则可以将生成的文件作为字节数组进行访问
如果您需要将其作为流, ,然后(来自 https://stackoverflow.com/a/4736185/432976 )
In Visual Studio you can directly embed access to a file resource via the Resources tab of the Project properties ("Analytics" in this example).
The resulting file can then be accessed as a byte array by
Should you need it as a stream, then ( from https://stackoverflow.com/a/4736185/432976 )
将文件添加到资源时,您应该选择其访问修饰符为公共,而不是可以进行如下操作。
CLIST01 是嵌入文件的名称。
实际上你可以去resources.Designer.cs看看getter的名字是什么。
When you added the file to the resources, you should select its Access Modifiers as public than you can make something like following.
CLIST01 is the name of the embedded file.
Actually you can go to the resources.Designer.cs and see what is the name of the getter.
添加例如Testfile.sql
项目菜单 ->属性->资源->添加现有文件
adding e.g. Testfile.sql
Project Menu -> Properties -> Resources -> Add Existing file
我知道这是一个旧线程,但这对我有用:
阅读如下文本:
我添加到资源中的文本:'SomeText.txt'
I know it is an old thread, but this is what worked for me :
read the text like this :
The text that I added to the resources: 'SomeText.txt'
我刚才了解到的是,你的文件不允许有“.”。文件名中的(点)。
Templates.plainEmailBodyTemplate-en.txt -->有效!!!
Templates.plainEmailBodyTemplate.en.txt -->无法通过 GetManifestResourceStream() 工作
可能是因为框架对名称空间与文件名感到困惑......
Something I learned just now is that your file is not allowed to have a "." (dot) in the filename.
Templates.plainEmailBodyTemplate-en.txt --> Works!!!
Templates.plainEmailBodyTemplate.en.txt --> doesn't work via GetManifestResourceStream()
Probably because the framework gets confused over namespaces vs filename...
您还可以使用@dtb 答案的简化版本:
You can also use this simplified version of @dtb's answer:
通过综合您的所有力量,我使用此帮助程序类以通用方式从任何程序集和任何命名空间读取资源。
By all your powers combined I use this helper class for reading resources from any assembly and any namespace in a generic way.
我知道这已经过时了,但我只是想指出NETMF(.Net MicroFramework),您可以轻松地做到这一点:
因为NETMF< /em> 没有
GetManifestResourceStream
I know this is old, but I just wanted to point out for NETMF (.Net MicroFramework), you can easily do this:
Since NETMF doesn't have
GetManifestResourceStream
某些 VS .NET 项目类型不会自动生成 .NET (.resx) 文件。以下步骤将资源文件添加到您的项目中:
Resources
的类。现在您可以添加文本文件作为资源,例如 xml 文件:
Resources
类具有一个名为string
类型的属性在包含的文件之后。如果文件名为 RibbonManifest.xml,则该属性的名称应为RibbonManifest
。您可以在代码文件 Resources.Designer.cs 中找到确切的名称。string xml = Resources.RibbonManifest
。一般形式为ResourceFileName.IncludedTextFileName
。不要使用ResourceManager.GetString
,因为字符串属性的 get 函数已经完成了该操作。Some VS .NET project types don’t auto-generate a .NET (.resx) file. The following steps add a Resource file to your project:
Resources
.Now you can add a text file as a resource, for example an xml file:
Resources
has a property of typestring
that is named after the included file. If the file name is e.g. RibbonManifest.xml, then the property should have the nameRibbonManifest
. You find the exact name in the code file Resources.Designer.cs.string xml = Resources.RibbonManifest
. The general form isResourceFileName.IncludedTextFileName
. Don’t useResourceManager.GetString
since the get-function of the string property has done that already.我读了一个嵌入式资源文本文件使用:
示例:
I read an embedded resource text file use:
Sample:
阅读此处发布的所有解决方案后。这就是我解决它的方法:
After reading all the solutions posted here. This is how I solved it:
您可能会发现这个类非常方便从当前的
Assembly
读取嵌入的资源文件:This is a class which you might find very convenient for reading embedded resource files from the current
Assembly
:答案很简单,如果您直接从 resources.resx 添加文件,只需执行此操作即可。
通过该行代码,可以直接从文件中读取文件中的文本并将其放入字符串变量中。
The answer is quite simple, simply do this if you added the file directly from the resources.resx.
With that line of code, the text from the file is directly read from the file and put into the string variable.
正如 SonarCloud 所指出的,更好的做法是:
As indicated by SonarCloud better to do:
我想将嵌入式资源作为字节数组来读取(不假设任何特定编码),最终我使用了 MemoryStream,这使得它非常简单:
I wanted to read the embedded resource just as a byte array (without assuming any specific encoding), and I ended up using a
MemoryStream
which makes it very simple:我很恼火的是,您必须始终在字符串中包含名称空间和文件夹。我想简化对嵌入式资源的访问。这就是我写这个小课程的原因。欢迎使用和改进!
用途:
类别:
I was annoyed that you had to always include the namespace and the folder in the string. I wanted to simplify the access to the embedded resources. This is why I wrote this little class. Feel free to use and improve!
Usage:
Class:
对于所有只想快速获取 winforms 中硬编码文件文本的人;
Resources..toString();
即可读取文件。我不会推荐将此作为最佳实践或任何其他内容,但它运行速度很快并且可以完成所需的工作。
For all the people that just quickly want the text of a hardcoded file in winforms;
Resources.<name of resource>.toString();
to read the file.I would not recommend this as best practice or anything, but it works quickly and does what it needs to do.
这里的大多数答案将基本或完整名称空间作为常量,或迭代
GetManifestResourceNames
中的所有资源来获取它。我有更简单但不完美的解决方案:
当然文件应标记为“嵌入式资源”。
Most of answers here holds base or full namespace as a constant or iterate over all resources from
GetManifestResourceNames
to get it.I have much simpler but not perfect solution:
Of course file shold be marked as "Embedded Resource".
读取表单加载事件中的嵌入式 TXT 文件。
动态设置变量。
调用 Try Catch。
为 IncludeText() 创建 Void,Visual Studio 会为您执行此操作。单击灯泡以自动生成代码块。
将以下内容放入生成的代码块
资源 1
资源 2
资源 3
如果您希望将返回的变量发送到其他地方,只需调用另一个函数,然后...
这实现的是一个组合方法多个 txt 文件,并在单个富文本框中读取其嵌入数据。这是我对这个代码示例所期望的效果。
Read Embedded TXT FILE on Form Load Event.
Set the Variables Dynamically.
Call a Try Catch.
Create Void for IncludeText(), Visual Studio Does this for you. Click the Lightbulb to AutoGenerate The CodeBlock.
Put the following inside the Generated Code Block
Resource 1
Resource 2
Resource 3
If you wish to send the returned variable somewhere else, just call another function and...
What this achieved was this, a method to combine multiple txt files, and read their embedded data, inside a single rich text box. which was my desired effect with this sample of Code.
对于使用 VB.Net 的用户,
其中
MyApplicationName
是我的应用程序的命名空间。它不是程序集名称。
该名称在项目属性(“应用程序”选项卡)中定义。
如果找不到正确的资源名称,可以使用
GetManifestResourceNames()
或
函数
For users that are using VB.Net
where
MyApplicationName
is namespace of my application.It is not the assembly name.
This name is define in project's properties (Application tab).
If you don't find correct resource name, you can use
GetManifestResourceNames()
functionor
or