协慌网

登录 贡献 社区

如何读取嵌入式资源文本文件

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方法

  1. 添加以下用法

    using System.IO;
    using System.Reflection;
  2. 设置相关文件的属性:
    具有价值的Embedded Resource参数Build Action

  3. 使用以下代码

    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#代码不同,这取决于首先添加文件所使用的方法。

方法 1:添加现有文件,将属性设置为 “ Embedded Resource

将文件添加到您的项目,然后将类型设置为Embedded Resource

注意:如果使用此方法添加文件,则可以使用GetManifestResourceStream来访问它(请参阅@dtb 中的答案)。

在此处输入图片说明

方法 2:将文件添加到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!");
   }