3

我试图弄清楚如何在 WinRT 中逐行读取和写入一个大文本文件。

FileIO.ReadLinesAsync 分别 FileIO.WriteLinesAsync 将不起作用,因为它们使用分别返回的字符串列表。使用可能导致 OutOfMemoryException 的大型文本文件。

我当然可以使用 FileIO.AppendTextAsync 逐行编写,但这效率低下。

我发现我可以像下面的示例代码一样使用 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

实际上,您对字符串列表的假设并不完全正确。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 回答
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 回答