web-dev-qa-db-ja.com

.netフレームワークは、ファイルシステムを操作するための非同期メソッドを提供しますか?

.netフレームワークには、ファイルシステムを操作できるasync組み込みライブラリ/アセンブリがありますか(例:File.ReadAllBytesFile.WriteAllBytes)?

または、asyncおよびStreamReaderStreamWriterメソッドを使用して独自のライブラリを作成する必要がありますか?

このようなものはかなりいいでしょう:

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

.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);
}
34
i3arnon

すでにそれをしています。たとえば、 ファイルアクセスに非同期を使用 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);
    };
}
16

.netフレームワークには、ファイルシステム(File.ReadAllBytes、File.WriteAllBytesなど)を操作できる非同期組み込みライブラリ/アセンブリがありますか?

残念ながら、非同期ファイル操作に関しては、デスクトップAPIは少し不安定です。既に説明したように、Niceの便利なメソッドの多くには、同等の非同期メソッドがありません。また、ファイルの非同期openingもありません(これは、ネットワーク共有を介してファイルを開くときに特に便利です)。

世界が.NET Coreに移行するにつれて、これらのAPIが追加されることを期待しています。

または、StreamReaderとStreamWriterの非同期メソッドを使用して独自のライブラリを作成する必要がありますか?

これが現在の最良のアプローチです。

ReadAsync/WriteAsyncとその友達を使用する場合は、明示的に非同期アクセスのためにファイルを開く必要があることに注意してください。これを(現在)行う唯一の方法は、bool isAsyncパラメーター(FileStreamを渡す)またはtrueパラメーター(FileOptions.Asynchronousを渡す)を受け取るFileOptionsコンストラクターオーバーロードを使用することです。したがって、File.Openのような便利なオープンメソッドを使用することはできません。

10
Stephen Cleary

.NETコア(バージョン2.0以降)には、対応するReadAll/WriteAll/AppendAllメソッドのすべての非同期フレーバーがあります:

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

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

残念ながら、.NET標準2.0にはまだありません。

3
adospace