1. ホーム
  2. c#

StreamオブジェクトのReadAllLines?

2023-11-02 15:47:55

質問

には File.ReadAllLines は存在するが Stream.ReadAllLines .

using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Test_Resources.Resources.Accounts.txt"))
using (StreamReader reader = new StreamReader(stream))
{
    // Would prefer string[] result = reader.ReadAllLines();
    string result = reader.ReadToEnd();
}

これを行う方法はありますか、それとも手動で一行ずつファイルをループしなければならないのでしょうか?

どのように解決するのですか?

以下のように、一行ずつ読み込むメソッドを書けばよいでしょう。

public IEnumerable<string> ReadLines(Func<Stream> streamProvider,
                                     Encoding encoding)
{
    using (var stream = streamProvider())
    using (var reader = new StreamReader(stream, encoding))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            yield return line;
        }
    }
}

として、呼び出す。

var lines = ReadLines(() => Assembly.GetExecutingAssembly()
                                    .GetManifestResourceStream(resourceName),
                      Encoding.UTF8)
                .ToList();

Func<> の部分は、複数回の読み込みに対応するためと、不必要にストリームを開いたままにしないためのものです。もちろん、このコードをメソッドで簡単にラップすることができます。

一度にすべてをメモリに入れる必要がなければ ToList ...