埋め込みリソーステキストファイルの読み方


693

を使用して埋め込みリソース(テキストファイル)を読み取り、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();
}

回答:


1194

あなたは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.GetManifestResourceNamesMethodを使用して、アセンブリ内のすべてのリソースのリストを取得できます。


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

5
@ Me.Close:Environment.SpecialFolderデスクトップフォルダーを取得するために見てください。リソースはプロジェクト内のパスに基づいて名前空間が付けられるため、その名前がだけではない可能性があることに留意する必要がありますfile1.txt
adrianbanks 2010

15
の引数にGetManifestResourceStreamは、@ adrianが示すようにパスが必要です。それが誰かを助ける場合、そのパスは@SimpleCoderが例で示すもののようになりますMyNamespace.Filename.Ext。以前に試しましたMyNamespace.Resources.Filename.Extが、結果はnullになります。
JYelton、2012年

61
リソースが直接プロジェクトルートではなくサブフォルダーにある場合は、このフォルダー名をresourceNameにも含めることを忘れないでください(例: "MyProjectNameSpace.MyProjectSubFolder.FileName.FileExtention")
Sasha

19
リソース「Build Action」は「Embedded Resource」として設定する必要があると言うに
値する

7
ここではカバーされていない重要なポイントの1つ。奇数文字(私の場合はUTF8)に対処するために代替エンコーディングタイプとしてファイルを保存した場合、ストリームを読み取るときに空のファイルが返されることがあります。ストリームリーダーのコンストラクタで符号化タイプを指定することによって、この問題を解決する:using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
キネティック

140

2つの方法でファイルをリソースとして追加できます。

ファイルへのアクセスに必要なC#コードは、最初にファイルを追加するために使用した方法によって異なります。

方法1:既存のファイルを追加し、プロパティを Embedded Resource

ファイルをプロジェクトに追加し、タイプをに設定しEmbedded Resourceます。

注:この方法を使用してファイルを追加すると、を使用してそのファイルGetManifestResourceStreamにアクセスできます(@dtbからの回答を参照)。

ここに画像の説明を入力してください

方法2:ファイルを追加する Resources.resx

Resources.resxファイルを開き、ドロップダウンボックスを使用してファイルを追加し、に設定Access Modifierpublicます。

注:この方法でファイルを追加すると、を使用してそのファイルProperties.Resourcesにアクセスできます(@Night Walkerからの回答を参照)。

ここに画像の説明を入力してください


5
3番目の方法は、ファイルをプロジェクトに追加し、「出力ディレクトリにコピー」を「True」に設定することです。コンパイル時に、ファイルは出力ディレクトリにコピーされ、通常の方法でファイルを読み取ることができます。例:画像を表示したい場合のWPFアプリ。
コンタンゴ2015

それで、ビルドアクションを設定しResourceて、アイテムをリソースとして読み取ることができるようにすることはありませんか?使用するEmbeddedResourceか、Resources.resxファイルに追加する必要がありますか?
Maslow

3
@Maslowビルドアクションを 'Resource'に設定すると、リンクされたリソースが作成されますが、ビルドアクションを 'Embedded Resource'に設定すると、リソースが出力アセンブリにコンパイルされます。「リンクされたリソース」という用語は、「コンパイル時にファイルを出力ディレクトリにコピーする」の空想的な用語です(通常の方法を使用して、実行時にファイルを読み取ることができます)。これら2つのタイプの違いの詳細については、msdn.microsoft.com/ en- us/library/7k989cfy(v=vs.90 ) .aspxの「リソースの追加と編集(Visual C#)」を参照してください
Contango、2015年

この方法でリソースを動的に使用する場合は、これの代わりに、次の Properties.Resources.Your_resource_name ように記述します Properties.Resources.ResourceManager.GetObject("Your_resource_name")
ルコール

86

基本的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!");
   }

32
+1 namespaceリソース名の一部としてを含めるため
Kirk Broadhurst

41
var auxList= System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); この方法は、正確なリソース名を知りたい場合に非常に役立ちます。(質問stackoverflow.com/questions/27757/…から取得
オスカーフォーリー

69

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

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

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

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

Stream stream = new MemoryStream(jsonSecrets)

11
これをテキストファイルで使用することもできます。その場合、次のようになります。string jsonSecrets = YourNameSpace.Properties.Resources.YourFileName;
ouflak 2013年

30

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

byte[] clistAsByteArray = Properties.Resources.CLIST01;

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

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


5
これについてもっと説明してもらえますか?ソリューションエクスプローラーでファイルを右クリックして[プロパティ]を選択し、次にに設定ActionするIncorporated ressourceAccess Modifiers、プロパティパネルにフィールドがありません。また、Propersites.Resourcesクラスがないので、The name 'Properties' does not exist in the current contextコードをコンパイルするとエラーが発生します。
スザンヌデュペロン2013年

2
これは、ファイルをに埋め込む場合にのみ機能しますResources.resx。ファイルをプロジェクトに埋め込むためのさまざまな方法についての私の回答を参照してください。
Contango 2014年

13

追加例:Testfile.sqlプロジェクトメニュー->プロパティ->リソース->既存ファイルの追加

    string queryFromResourceFile = Properties.Resources.Testfile.ToString();

ここに画像の説明を入力してください


2
これはbyte []を返します。テキストファイルの場合は、 `Encoding.UTF8.GetString(Properties.Resources.Testfile)`を使用します
MikeTheCoder

12

私はそれが古いスレッドであることを知っていますが、これは私にとってうまくいったものです:

  1. テキストファイルをプロジェクトリソースに追加する
  2. 上記のAndrew Hillで示したように、アクセス修飾子をpublicに設定します
  3. このようなテキストを読んでください:

    textBox1 = new TextBox();
    textBox1.Text = Properties.Resources.SomeText;

リソースに追加したテキスト: 'SomeText.txt'


8

@dtbの回答のこの簡略版を使用することもできます。

public string GetEmbeddedResource(string ns, string res)
{
    using (var reader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(string.Format("{0}.{1}", ns, res))))
    {
        return reader.ReadToEnd();
    }
}

よろしいですか?このに従って私はのように、このリンクに見える.... stackoverflow.com/questions/1065168/...
Timmerz

8

私がたった今学んだことは、あなたのファイルが「。」を持つことを許可されていないということです。(ドット)ファイル名。

「。」 ファイル名に問題があります。

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

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


3
ごめんなさい。これは間違っています。ドットは機能します。(少なくとも私にとってはうまくいった、NET4.5)なぜこのバグがあったのか分かりません。
Felix Keil、2015

はい、機能しますが、ディレクトリ区切り文字として機能します。Templates.plainEmailBodyTemplate.en.txtは "\ Templates \ plainEmailBodyTemplate \ en.txt"リソースを検索します
Peter Gfader

いいえ、試しました。GetManifestResourceStreamは、ファイル名に複数のドットを含む埋め込みリソースにアクセスできます。(NET4.5)
Felix Keil、

1
.NET 4.5でも同じ問題が発生しました。名前にドットが含まれるファイルは、リソースコレクションにも追加されませんでした。メソッドassembly.GetManifestResourceNames()が空のリストをme.Laterに返します問題は言語コードにのみあることがわかりました。ca.abcd.sktが問題なく追加されている間、ca.abcd.sk.crtはリソースに追加されませんでした。
a.farkas2508 2017

1
それでも2020年は正解です。多くのおかげで、私はこれに夢中になりました。
ZeRemz

8

すべての力を組み合わせて、このヘルパークラスを使用して、任意のアセンブリおよび任意の名前空間からリソースを一般的な方法で読み取ります。

public class ResourceReader
{
    public static IEnumerable<string> FindEmbededResources<TAssembly>(Func<string, bool> predicate)
    {
        if (predicate == null) throw new ArgumentNullException(nameof(predicate));

        return
            GetEmbededResourceNames<TAssembly>()
                .Where(predicate)
                .Select(name => ReadEmbededResource(typeof(TAssembly), name))
                .Where(x => !string.IsNullOrEmpty(x));
    }

    public static IEnumerable<string> GetEmbededResourceNames<TAssembly>()
    {
        var assembly = Assembly.GetAssembly(typeof(TAssembly));
        return assembly.GetManifestResourceNames();
    }

    public static string ReadEmbededResource<TAssembly, TNamespace>(string name)
    {
        if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
        return ReadEmbededResource(typeof(TAssembly), typeof(TNamespace), name);
    }

    public static string ReadEmbededResource(Type assemblyType, Type namespaceType, string name)
    {
        if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType));
        if (namespaceType == null) throw new ArgumentNullException(nameof(namespaceType));
        if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));

        return ReadEmbededResource(assemblyType, $"{namespaceType.Namespace}.{name}");
    }

    public static string ReadEmbededResource(Type assemblyType, string name)
    {
        if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType));
        if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));

        var assembly = Assembly.GetAssembly(assemblyType);
        using (var resourceStream = assembly.GetManifestResourceStream(name))
        {
            if (resourceStream == null) return null;
            using (var streamReader = new StreamReader(resourceStream))
            {
                return streamReader.ReadToEnd();
            }
        }
    }
}

3
キャプテンプラネット用に1つ追加:P
Alok

4

埋め込まれたリソーステキストファイルの使用を読み取ります。

    /// <summary>
    /// Converts to generic list a byte array
    /// </summary>
    /// <param name="content">byte array (embedded resource)</param>
    /// <returns>generic list of strings</returns>
    private List<string> GetLines(byte[] content)
    {
        string s = Encoding.Default.GetString(content, 0, content.Length - 1);
        return new List<string>(s.Split(new[] { Environment.NewLine }, StringSplitOptions.None));
    }

サンプル:

var template = GetLines(Properties.Resources.LasTemplate /* resource name */);

template.ForEach(ln =>
{
    Debug.WriteLine(ln);
});

3

私はこれが古いことを知っていますが、NETMF(.Net MicroFramework)を指摘したかっただけで、簡単にこれを行うことができます。

string response = Resources.GetString(Resources.StringResources.MyFileName);

以来NETMFはありません。GetManifestResourceStream


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 "";      
}

3

答えは非常に簡単です。resources.resxから直接ファイルを追加した場合は、このようにしてください。

string textInResourceFile = fileNameSpace.Properties.Resources.fileName;

このコード行では、ファイルのテキストがファイルから直接読み取られ、文字列変数に入れられます。


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)));

}

1
そして、超シンプルなソリューションについてはどうですか:var resName = assembly.GetManifestResourceNames()。Where(i => i.EndsWith(fileName))。FirstOrDefault(); ディレクトリ全体をアセンブリに配置すると機能しませんが、それ以外の場合は1行です;)
Harry

@ハリー、確かにこれができる。これは私の回答とどのように関連していますか?GetStreamメソッドを改善しますか?それでは、あいまいさをどのように処理しますか?
Felix Keil、2016

1
システムを使用した@Estevez; System.IOを使用します。System.Linqを使用します。System.Reflectionを使用します。
Felix Keil 2017年

2
何らかの理由で、クラスが別のプロジェクトに配置されたときに機能しません。アセンブリの呼び出しと実行はどちらも、実際にテストを実行するアセンブリではなく、このクラスのアセンブリを参照します。静的で遅延のある初期化がなければ、いいですね。
カーリーブレース

1
@CurlyBraceありがとうございます。呼び出しと実行のアセンブリはコンテキストに応じて変化するため、遅延評価はこの答えの本当の欠陥です。すべてのアクセスで解決する必要があります。
Felix Keil、

2

一部のVS .NETプロジェクトタイプは、.NET(.resx)ファイルを自動生成しません。次の手順では、プロジェクトにリソースファイルを追加します。

  1. プロジェクトノードを右クリックして[アイテムの追加/新規作成]を選択し、[リソースファイル]までスクロールします。[名前]ボックスで、適切な名前(リソースなど)を選択し、[追加]ボタンをクリックします。
  2. リソースファイルResources.resxがプロジェクトに追加され、ソリューションエクスプローラーでノードとして表示できます。
  3. 実際には、2つのファイルが作成され、自動生成されたC#クラスResources.Designer.csもあります。それを編集しないでください、それはVSによって維持されます。ファイルにはという名前のクラスが含まれていますResources

これで、XMLファイルなどのテキストファイルをリソースとして追加できます。

  1. Resources.resxをダブルクリックします。[リソースの追加]> [既存のファイルの追加]を選択し、含めるファイルまでスクロールします。アクセス変更のデフォルト値は「内部」のままにします。
  2. アイコンは新しいリソースアイテムを表します。選択すると、プロパティペインにそのプロパティが表示されます。xmlファイルの場合、プロパティの[エンコーディング]で、デフォルトのローカルコードページではなく、[Unicode(UTF-8)–コードページ65001]を選択します。他のテキストファイルについては、このファイルの正しいエンコードを選択してください(例:コードページ1252)。
  3. xmlファイルなどのテキストファイルの場合、クラスにResourcesstring、インクルードファイルにちなんで名前が付けられたタイプのプロパティがあります。ファイル名がRibbonManifest.xmlなどの場合、プロパティの名前はになりますRibbonManifest。コードファイルResources.Designer.csで正確な名前を見つけます。
  4. 文字列プロパティは、他の文字列プロパティと同様に使用しますstring xml = Resources.RibbonManifest。次に例を示します。一般的な形式はResourceFileName.IncludedTextFileNameです。ResourceManager.GetString文字列プロパティのget関数はすでにそれを行っているので、使用しないでください。

1
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;
    }
}

0

これは、現在の埋め込みリソースファイルを読み取るのに非常に便利なクラスですAssembly

using System.IO;
using System.Linq;
using System.Text;
using static System.IO.Path;
using static System.Reflection.Assembly;

public static class EmbeddedResourceUtils
{
    public static string ReadFromResourceFile(string endingFileName)
    {
        var assembly = GetExecutingAssembly();
        var manifestResourceNames = assembly.GetManifestResourceNames();

        foreach (var resourceName in manifestResourceNames)
        {
            var fileNameFromResourceName = _GetFileNameFromResourceName(resourceName);
            if (!fileNameFromResourceName.EndsWith(endingFileName))
            {
                continue;
            }

            using (var manifestResourceStream = assembly.GetManifestResourceStream(resourceName))
            {
                if (manifestResourceStream == null)
                {
                    continue;
                }

                using (var streamReader = new StreamReader(manifestResourceStream))
                {
                    return streamReader.ReadToEnd();
                }
            }
        }

        return null;
    }

    // https://stackoverflow.com/a/32176198/3764804
    private static string _GetFileNameFromResourceName(string resourceName)
    {
        var stringBuilder = new StringBuilder();
        var escapeDot = false;
        var haveExtension = false;

        for (var resourceNameIndex = resourceName.Length - 1;
            resourceNameIndex >= 0;
            resourceNameIndex--)
        {
            if (resourceName[resourceNameIndex] == '_')
            {
                escapeDot = true;
                continue;
            }

            if (resourceName[resourceNameIndex] == '.')
            {
                if (!escapeDot)
                {
                    if (haveExtension)
                    {
                        stringBuilder.Append('\\');
                        continue;
                    }

                    haveExtension = true;
                }
            }
            else
            {
                escapeDot = false;
            }

            stringBuilder.Append(resourceName[resourceNameIndex]);
        }

        var fileName = GetDirectoryName(stringBuilder.ToString());
        return fileName == null ? null : new string(fileName.Reverse().ToArray());
    }
}

0

winformsでハードコードされたファイルのテキストをすぐに必要とするすべての人にとって。

  1. ソリューションエクスプローラーで[アプリケーション]を右クリックし、[リソース]> [ファイルを追加]をクリックします。
  2. それをクリックし、プロパティタブで「FileType」を「Text」に設定します。
  3. プログラムではResources.<name of resource>.toString();、ファイルを読み取るだけです。

私はこれをベストプラクティスなどとしてはお勧めしませんが、すぐに機能し、必要なことを実行します。


0

VB.Netを使用しているユーザーの場合

Imports System.IO
Imports System.Reflection

Dim reader As StreamReader
Dim ass As Assembly = Assembly.GetExecutingAssembly()
Dim sFileName = "MyApplicationName.JavaScript.js" 
Dim reader = New StreamReader(ass.GetManifestResourceStream(sFileName))
Dim sScriptText = reader.ReadToEnd()
reader.Close()

どこ MyApplicationNameアプリケーションの名前空間はですか。アセンブリ名ではありません。この名前は、プロジェクトのプロパティ([アプリケーション]タブ)で定義されます。

正しいリソース名が見つからない場合は、GetManifestResourceNames()関数を使用できます

Dim resourceName() As String = ass.GetManifestResourceNames()

または

Dim sName As String 
    = ass.GetManifestResourceNames()
        .Single(Function(x) x.EndsWith("JavaScript.js"))

または

Dim sNameList 
    = ass.GetManifestResourceNames()
        .Where(Function(x As String) x.EndsWith(".js"))

-1

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

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

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

Try Catchを呼び出します。

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を作成します。VisualStudioがこれを行います。電球をクリックして、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つのリッチテキストボックス内に埋め込まれたデータを読み取る方法が実現しました。これは、このコードのサンプルで私が望んだ効果でした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.