.net框架是否提供了使用文件系统的异步方法?

Ben*_*dEg 28 c# filesystems asynchronous async-await system.io.file

请问.NET框架的async内置库/组件,它可以与文件系统的工作(例如File.ReadAllBytes,File.WriteAllBytes)?

还是我用我自己写的库async的方法StreamReaderStreamWriter

像这样的东西会很不错:

var bytes = await File.ReadAllBytes("my-file.whatever");
Run Code Online (Sandbox Code Playgroud)

i3a*_*non 36

.net框架是否具有异步内置库/程序集,允许使用文件系统

是.有异步方法用于处理文件系统,但不支持静态File类型的辅助方法.他们在FileStream.

所以,没有,File.ReadAllBytesAsync但有FileStream.ReadAsync,等等.例如:

byte[] result;
using (FileStream stream = File.Open(@"C:\file.txt", FileMode.Open))
{
    result = new byte[stream.Length];
    await stream.ReadAsync(result, 0, (int)stream.Length);
}
Run Code Online (Sandbox Code Playgroud)

  • @Dave可能.在这种情况下,您可能需要阅读块. (2认同)
  • 无论如何,您都应该具有分块读取的逻辑。根据 [Microsoft 文档](https://docs.microsoft.com/en-us/dotnet/api/system.io.filestream.readasync?view=netframework-4.7.1#System_IO_FileStream_ReadAsync_System_Byte___System_Int32_System_Int32_System_Threading_CancellationToken_),ReadAsync 不保证填充整个阵列。您需要检查返回值以查看它_实际_读取了多少。 (2认同)
  • 您可以考虑将代码更改为 [类似的东西](https://pastebin.com/68PrKYJg)(对于小文件 - 不要对 3 GB 以上的文件这样做)。 (2认同)

Mat*_*zer 16

它已经做到了.请参阅例如使用Async for File Access MSDN文章.

private async Task WriteTextAsync(string filePath, string text)
{
    byte[] encodedText = Encoding.Unicode.GetBytes(text);

    using (FileStream sourceStream = new FileStream(filePath,
        FileMode.Append, FileAccess.Write, FileShare.None,
        bufferSize: 4096, useAsync: true))
    {
        await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
    };
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ary 10

.net框架是否具有允许使用文件系统的异步内置库/程序集(例如File.ReadAllBytes,File.WriteAllBytes)?

不幸的是,桌面API在异步文件操作方面有点不稳定.如您所述,许多不错的便捷方法没有异步等价物.还缺少异步打开文件(在通过网络共享打开文件时尤其有用).

我希望在世界迁移到.NET Core时添加这些API.

或者我是否必须使用StreamReader和StreamWriter的异步方法编写自己的库?

这是目前最好的方法.

请注意,使用ReadAsync/ WriteAsync和朋友时,必须显式打开文件以进行异步访问.执行此操作(当前)的唯一方法是使用FileStream带有bool isAsync参数(传递true)或FileOptions参数(传递FileOptions.Asynchronous)的构造函数重载.所以你不能使用像方便的开放方法File.Open.


ado*_*ace 6

在 .NET 核心(自 2.0 版起)中,现在有相应 ReadAll/WriteAll/AppendAll 方法的所有异步风格,例如:

File.(Read|Write|Append)All(Text|Lines|Bytes)Async
Run Code Online (Sandbox Code Playgroud)

https://docs.microsoft.com/en-us/dotnet/api/system.io.file.readallbytesasync?view=netcore-2.1

不幸的是,.NET 标准 2.0 中仍然缺少它们。