1. ホーム
  2. .net

[解決済み] 埋め込みリソーステキストファイルの読み方

2022-03-23 14:41:13

質問

埋め込みリソース(テキストファイル)を 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. 該当するファイルのプロパティを設定する。
    パラメータ Build Action 値付き Embedded Resource

  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 に埋め込まれたリソースの1つの名前です。 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();
    }
}