3

WinRT で大きなテキスト ファイルを 1 行ずつ読み書きする方法を見つけようとしています。

FileIO.ReadLinesAsync それぞれ FileIO.WriteLinesAsync は、それぞれ返される渡された文字列のリストを操作するため、機能しません。OutOfMemoryException を引き起こす可能性がある大きなテキスト ファイル。

もちろん、FileIO.AppendTextAsync を使用して 1 行ずつ記述することもできますが、それは非効率的です。

私が理解したのは、以下のサンプル コードのように StreamReader または StreamWriter を使用できるということでした。

しかし、これを実現するためのネイティブな Windows ランタイムの方法は本当にないのでしょうか?

ところで、Windows ストア アプリは大きなテキスト ファイルの読み取りまたは書き込みを想定していないことを知っています。プログラマー向けのレシピ本を書いているという理由だけで、解決策が必要です。

サンプル: StreamReader を使用した読み取り:

StorageFile file = ...

await Task.Run(async () =>
{
   using (IRandomAccessStream winRtStream = await file.OpenAsync(FileAccessMode.Read))
   {
      Stream dotnetStream = winRtStream.AsStreamForRead();
      using (StreamReader streamReader = new StreamReader(dotnetStream))
      {
         string line;
         while ((line = streamReader.ReadLine()) != null)
         {
            ...
         }
      }
   }
});
4

2 に答える 2

1

StreamWriterを使用して大きなファイルを書き込むための私のソリューションは次のとおりです。非常に大きなファイルを書き込んでも、使用されるメモリは低いままです。

StorageFile file = ...

using (var randomAccessStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
    using (var outputStream = randomAccessStream.GetOutputStreamAt(0))
    {
        using (StreamWriter streamWriter = 
           new StreamWriter(outputStream.AsStreamForWrite()))
        {
            for (...)
            {
                await streamWriter.WriteLineAsync(...);
             }
         }
      }
 }
于 2012-10-18T15:07:46.937 に答える
1

実際、文字列のリストに関するあなたの仮定は完全には正しくありません。FileIO.WriteLinesAsyncパラメータとして受け入れIEnumerable<string>ます。したがって、次のようなことができます。

IEnumerable<string> GenerateLines()
{
    for (int ix = 0; ix < 10000000; ix++)
        yield return "This is a line #" + ix;
}

//....
WriteLinesAsync(file, GenerateLines());

大きなファイルの読み取りに関しては、そのとおりです。サンプルで行ったようなカスタム作業が必要です。

于 2012-10-18T09:16:47.250 に答える