Windows runtime 是否仅使用StreamReader/StreamWriter在WinRT中读取/写入大型文本文件?
我试图弄清楚如何在WinRT中逐行读取和写入大型文本文件 FileIO.ReadLinesAsync respect FileIO.WriteLinesAsync无法工作,因为它们使用的是分别传递和返回的字符串列表。使用可能导致OutOfMemoryException的大型文本文件 我当然可以使用FileIO.AppendTextAsync逐行编写,但这样做效率很低 我发现我可以使用下面示例代码中的StreamReader或StreamWriter 但真的没有原生Windows运行时方法来实现这一点吗 顺便说一句,我知道Windows应用商店应用程序不应该读取或写入大型文本文件。我需要一个解决方案,因为我正在为程序员编写一本食谱 示例:使用StreamReader进行读取: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运行时方法来实现这
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似乎是最好的解决方案。