Windows runtime 是否仅使用StreamReader/StreamWriter在WinRT中读取/写入大型文本文件?

Windows runtime 是否仅使用StreamReader/StreamWriter在WinRT中读取/写入大型文本文件?,windows-runtime,winrt-xaml,windows-store-apps,Windows Runtime,Winrt Xaml,Windows Store Apps,我试图弄清楚如何在WinRT中逐行读取和写入大型文本文件 FileIO.ReadLinesAsync respect FileIO.WriteLinesAsync无法工作,因为它们使用的是分别传递和返回的字符串列表。使用可能导致OutOfMemoryException的大型文本文件 我当然可以使用FileIO.AppendTextAsync逐行编写,但这样做效率很低 我发现我可以使用下面示例代码中的StreamReader或StreamWriter 但真的没有原生Windows运行时方法来实现这

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

FileIO.ReadLinesAsync respect 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)
         {
            ...
         }
      }
   }
});

实际上,你关于字符串列表的假设并不完全正确
FileIO.WriteLinesAsync
接受
IEnumerable
作为参数。所以你可以这样做:

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

//....
WriteLinesAsync(file, GenerateLines());
IEnumerable GenerateLines()
{
对于(int-ix=0;ix<10000000;ix++)
收益回报率“这是一行”+ix;
}
//....
WriteLinesAsync(文件,GenerateLines());

至于读取大文件,您是对的,我们需要一些自定义工作,就像您在示例中所做的那样。

以下是我使用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(...);
             }
         }
      }
 }

我试过了。尝试写入大文件(尝试写入1000 MB)时导致OutOfMemoryException。当逐行写入时,您可以看到任务管理器中的内存增长。使用StreamWriter,内存保持正常,我可以编写大文件。我也尝试了一个DataWriter,但除非我每写x行调用StoreAsync(这会使它变慢),否则我也会得到一个OutOfMemoryException。StreamWriter似乎是最好的解决方案。