如何使用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();
}
可以使用两种不同的方法将文件添加为资源。
访问文件所需的C#代码不同,这取决于首先添加文件所用的方法。
方法1:添加现有文件,将属性设置为Embedded Resource
将文件添加到项目中,然后将类型设置为“嵌入式资源”。
注意:如果使用此方法添加文件,则可以使用GetManifestResourceStream访问它(请参阅@dtb的答案)。
方法2:将文件添加到Resources.resx
打开Resources.resx文件,使用下拉框添加文件,将AccessModifier设置为public。
注意:如果使用此方法添加文件,则可以使用财产.资源访问它(请参阅@Night Walker的回答)。
public class AssemblyTextFileReader
{
private readonly Assembly _assembly;
public AssemblyTextFileReader(Assembly assembly)
{
_assembly = assembly ?? throw new ArgumentNullException(nameof(assembly));
}
public async Task<string> ReadFileAsync(string fileName)
{
var resourceName = _assembly.GetManifestResourceName(fileName);
using (var stream = _assembly.GetManifestResourceStream(resourceName))
{
using (var reader = new StreamReader(stream))
{
return await reader.ReadToEndAsync();
}
}
}
}
public static class AssemblyExtensions
{
public static string GetManifestResourceName(this Assembly assembly, string fileName)
{
string name = assembly.GetManifestResourceNames().SingleOrDefault(n => n.EndsWith(fileName, StringComparison.InvariantCultureIgnoreCase));
if (string.IsNullOrEmpty(name))
{
throw new FileNotFoundException($"Embedded file '{fileName}' could not be found in assembly '{assembly.FullName}'.", fileName);
}
return name;
}
}
// To use the code above:
var reader = new AssemblyTextFileReader(assembly);
string text = await reader.ReadFileAsync(@"MyFile.txt");
可以使用两种不同的方法将文件添加为资源。
访问文件所需的C#代码不同,这取决于首先添加文件所用的方法。
方法1:添加现有文件,将属性设置为Embedded Resource
将文件添加到项目中,然后将类型设置为“嵌入式资源”。
注意:如果使用此方法添加文件,则可以使用GetManifestResourceStream访问它(请参阅@dtb的答案)。
方法2:将文件添加到Resources.resx
打开Resources.resx文件,使用下拉框添加文件,将AccessModifier设置为public。
注意:如果使用此方法添加文件,则可以使用财产.资源访问它(请参阅@Night Walker的回答)。