795

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();
}
4

23 に答える 23

1388

Assembly.GetManifestResourceStreamメソッドを使用できます:

  1. 次の使用法を追加します

    using System.IO;
    using System.Reflection;
    
  2. 関連するファイルのプロパティを設定:値を持つ
    パラメーターBuild ActionEmbedded 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"、. Methodを使用して、アセンブリ内のすべてのリソースのリストを取得できます。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();
    }
}
于 2010-07-22T23:03:23.213 に答える
95

基本的にSystem.Reflection、現在のアセンブリへの参照を取得するために使用します。次に、 を使用します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!");
   }
于 2010-07-22T23:01:24.970 に答える
77

Visual Studio では、プロジェクト プロパティの [リソース] タブ (この例では "Analytics") を使用して、ファイル リソースへのアクセスを直接埋め込むことができます。 Visual Studio のスクリーン ショット - [リソース] タブ

結果のファイルは、バイト配列としてアクセスできます。

byte[] jsonSecrets = GoogleAnalyticsExtractor.Properties.Resources.client_secrets_reporter;

ストリームとして必要な場合は、( https://stackoverflow.com/a/4736185/432976から)

Stream stream = new MemoryStream(jsonSecrets)
于 2013-10-24T01:26:39.770 に答える
37

ファイルをリソースに追加するときは、次のようなものを作成するよりも、そのアクセス修飾子をパブリックとして選択する必要があります。

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01 は組み込みファイルの名前です。

実際には、resources.Designer.cs に移動して、ゲッターの名前を確認できます。

于 2012-04-20T16:34:12.480 に答える
11

私が今学んだことは、ファイルに「。」を含めることは許可されていないということです。(ドット) ファイル名。

あ

Templates.plainEmailBodyTemplate-en.txt --> 動作!!!
Templates.plainEmailBodyTemplate.en.txt --> GetManifestResourceStream() 経由では機能しません

おそらく、フレームワークが名前空間とファイル名で混乱するためです...

于 2015-07-03T17:28:58.313 に答える
3

ここに投稿されたすべてのソリューションを読んだ後。これが私がそれを解決した方法です:

// How to embedded a "Text file" inside of a C# project
//   and read it as a resource from c# code:
//
// (1) Add Text File to Project.  example: 'myfile.txt'
//
// (2) Change Text File Properties:
//      Build-action: EmbeddedResource
//      Logical-name: myfile.txt      
//          (note only 1 dot permitted in filename)
//
// (3) from c# get the string for the entire embedded file as follows:
//
//     string myfile = GetEmbeddedResourceFile("myfile.txt");

public static string GetEmbeddedResourceFile(string filename) {
    var a = System.Reflection.Assembly.GetExecutingAssembly();
    using (var s = a.GetManifestResourceStream(filename))
    using (var r = new System.IO.StreamReader(s))
    {
        string result = r.ReadToEnd();
        return result;
    }
    return "";      
}
于 2017-09-26T22:49:11.540 に答える
2

名前空間とフォルダーを常に文字列に含めなければならないことに腹を立てました。組み込みリソースへのアクセスを簡素化したかったのです。これが、私がこの小さなクラスを書いた理由です。自由に使って改善してください!

使用法:

using(Stream stream = EmbeddedResources.ExecutingResources.GetStream("filename.txt"))
{
 //...
}

クラス:

public class EmbeddedResources
{
    private static readonly Lazy<EmbeddedResources> _callingResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetCallingAssembly()));

    private static readonly Lazy<EmbeddedResources> _entryResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetEntryAssembly()));

    private static readonly Lazy<EmbeddedResources> _executingResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetExecutingAssembly()));

    private readonly Assembly _assembly;

    private readonly string[] _resources;

    public EmbeddedResources(Assembly assembly)
    {
        _assembly = assembly;
        _resources = assembly.GetManifestResourceNames();
    }

    public static EmbeddedResources CallingResources => _callingResources.Value;

    public static EmbeddedResources EntryResources => _entryResources.Value;

    public static EmbeddedResources ExecutingResources => _executingResources.Value;

    public Stream GetStream(string resName) => _assembly.GetManifestResourceStream(_resources.Single(s => s.Contains(resName)));

}
于 2015-09-09T19:25:08.953 に答える
-1

フォーム ロード イベントで埋め込み TXT ファイルを読み取ります。

変数を動的に設定します。

string f1 = "AppName.File1.Ext";
string f2 = "AppName.File2.Ext";
string f3 = "AppName.File3.Ext";

トライキャッチを呼び出します。

try 
{
     IncludeText(f1,f2,f3); 
     /// Pass the Resources Dynamically 
     /// through the call stack.
}

catch (Exception Ex)
{
     MessageBox.Show(Ex.Message);  
     /// Error for if the Stream is Null.
}

IncludeText() の Void を作成します。Visual Studio がこれを行います。電球をクリックして、CodeBlock を自動生成します。

生成されたコード ブロック内に次を配置します。

リソース 1

var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(file1))
using (StreamReader reader = new StreamReader(stream))
{
string result1 = reader.ReadToEnd();
richTextBox1.AppendText(result1 + Environment.NewLine + Environment.NewLine );
}

リソース 2

var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(file2))
using (StreamReader reader = new StreamReader(stream))
{
string result2 = reader.ReadToEnd();
richTextBox1.AppendText(
result2 + Environment.NewLine + 
Environment.NewLine );
}

リソース 3

var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(file3))

using (StreamReader reader = new StreamReader(stream))
{
    string result3 = reader.ReadToEnd();
    richTextBox1.AppendText(result3);
}

返された変数を別の場所に送りたい場合は、別の関数を呼び出して...

using (StreamReader reader = new StreamReader(stream))
{
    string result3 = reader.ReadToEnd();
    ///richTextBox1.AppendText(result3);
    string extVar = result3;

    /// another try catch here.

   try {

   SendVariableToLocation(extVar)
   {
         //// Put Code Here.
   }

       }

  catch (Exception ex)
  {
    Messagebox.Show(ex.Message);
  }

}

これが実現したのは、複数の txt ファイルを結合し、埋め込まれたデータを 1 つのリッチ テキスト ボックス内で読み取る方法です。これは、このコード サンプルで私が望んでいた効果でした。

于 2016-08-07T10:25:54.517 に答える