C# net framework是否提供异步方法来处理文件系统?

C# net framework是否提供异步方法来处理文件系统?,c#,asynchronous,filesystems,async-await,system.io.file,C#,Asynchronous,Filesystems,Async Await,System.io.file,.net framework是否具有允许与文件系统一起工作的内置库/程序集(例如,file.ReadAllBytes,file.writealbytes) 或者我必须使用StreamReader和StreamWriter的async方法编写自己的库吗 像这样的东西会很好: var bytes = await File.ReadAllBytes("my-file.whatever"); 它已经做到了。例如,请参阅MSDN文章 private async Task WriteTextAsync(s

.net framework是否具有允许与文件系统一起工作的内置库/程序集(例如,
file.ReadAllBytes
file.writealbytes

或者我必须使用
StreamReader
StreamWriter
async
方法编写自己的库吗

像这样的东西会很好:

var bytes = await File.ReadAllBytes("my-file.whatever");

它已经做到了。例如,请参阅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);
    };
}
net framework是否具有允许使用文件系统的异步内置库/程序集

对。有异步方法可用于处理文件系统,但不适用于静态
文件
类型上的helper方法。它们位于
FileStream

因此,没有
文件.readAllByteAsync
,但有
文件流.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);
}
.net framework是否具有允许使用文件系统的异步内置库/程序集(例如file.ReadAllBytes、file.WriteAllBytes)

不幸的是,桌面API在异步文件操作方面有点参差不齐。正如您所指出的,许多非常方便的方法并没有异步等价物。还缺少异步打开文件(这在通过网络共享打开文件时特别有用)

我希望这些API会随着世界向.NET核心的转移而增加

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

这是目前最好的办法

请注意,使用
ReadAsync
/
WriteAsync
和friends时,必须显式打开文件进行异步访问。(目前)唯一的方法是使用
FileStream
构造函数重载,该重载接受
bool isAsync
参数(传递
true
)或
FileOptions
参数(传递
FileOptions.Asynchronous
)。因此,您不能在.NET core(自2.0版起)中使用方便的打开方法,如
File.open

,现在有相应的ReadAll/WriteAll/AppendAll方法的所有异步版本,如:

File.(Read|Write|Append)All(Text|Lines|Bytes)Async


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

感谢您提供的信息,尤其是:
FileOptions.Asynchronous
谢谢<代码>isAsync似乎已磨损+1@BendEg如果您在一堆文件附近看到了弃用警告,那么这些废弃文件似乎是针对
IntPtr
FileStream()
变体的,因为有更好/更安全的
SafeHandle
替代方案。例如,您可以看到,未标记为“已过时”。如果要序列化为字节流的文件很大(3gb+),那么流长度是否可能实际上大于int类型可以存储的长度,并导致其溢出?@Dave可能。在这种情况下,你可能需要分块阅读。你应该有逻辑来分块阅读。根据,ReadAsync不能保证填充整个阵列。您需要检查返回值以查看它实际读取了多少。您可以考虑将代码更改为(对于小文件-不要这样做3 GB +文件)。您应该真正使用<代码> Soal.IO。StreamReader < /代码>来读取,而不是获取原始字节。它有
readlinesync
ReadToEndAsync
方法。它现在在.net标准2.1中提供