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();
}
您可以使用Assembly.GetManifestResourceStream
方法:
添加以下用法
using System.IO;
using System.Reflection;
设置相关文件的属性:
具有价值的Embedded Resource
参数Build Action
使用以下代码
var assembly = Assembly.GetExecutingAssembly();
var resourceName = "MyCompany.MyProduct.MyFile.txt";
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
using (StreamReader reader = new StreamReader(stream))
{
string result = reader.ReadToEnd();
}
resourceName
assembly
集中嵌入的资源之一的名称。例如,如果您将一个名为"MyFile.txt"
"MyCompany.MyProduct"
的项目的根目录中,则resourceName
为"MyCompany.MyProduct.MyFile.txt"
。 Assembly.GetManifestResourceNames
方法获取程序集中所有资源的列表。
毫不费吹灰之力地resourceName
(通过传递名称空间的东西):
string resourceName = assembly.GetManifestResourceNames()
.Single(str => str.EndsWith("YourFileName.txt"));
一个完整的例子:
public string ReadResource(string name)
{
// Determine path
var assembly = Assembly.GetExecutingAssembly();
string resourcePath = name;
// Format: "{Namespace}.{Folder}.{filename}.{Extension}"
if (!name.StartsWith(nameof(SignificantDrawerCompiler)))
{
resourcePath = assembly.GetManifestResourceNames()
.Single(str => str.EndsWith(name));
}
using (Stream stream = assembly.GetManifestResourceStream(resourcePath))
using (StreamReader reader = new StreamReader(stream))
{
return reader.ReadToEnd();
}
}
您可以使用两种单独的方法将文件添加为资源。
访问文件所需的 C#代码不同,这取决于首先添加文件所使用的方法。
Embedded Resource
将文件添加到您的项目,然后将类型设置为Embedded Resource
。
注意:如果使用此方法添加文件,则可以使用GetManifestResourceStream
来访问它(请参阅@dtb 中的答案)。
Resources.resx
打开Resources.resx
文件,使用下拉框添加文件,将Access Modifier
设置为public
。
注意:如果使用此方法添加文件,则可以使用Properties.Resources
来访问它(请参阅@Night Walker 的回答)。
基本上,您使用System.Reflection
获取对当前 Assembly 的引用。然后,使用GetManifestResourceStream()
。
例如,从我发布的页面中:
注意:需要using System.Reflection;
为了这个工作
Assembly _assembly;
StreamReader _textStreamReader;
try
{
_assembly = Assembly.GetExecutingAssembly();
_textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
}
catch
{
MessageBox.Show("Error accessing resources!");
}