web-dev-qa-db-fra.com

Le framework .net fournit-il des méthodes asynchrones pour travailler avec le système de fichiers?

Le framework .net possède-t-il une bibliothèque/un assemblage intégré async qui permet de travailler avec le système de fichiers (par exemple File.ReadAllBytes, File.WriteAllBytes)?

Ou dois-je écrire ma propre bibliothèque en utilisant les méthodes async de StreamReader et StreamWriter?

Quelque chose comme ça serait plutôt sympa:

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

Le framework .net possède-t-il une bibliothèque/assemblée intégrée asynchrone qui permet de travailler avec le système de fichiers

Oui. Il existe des méthodes asynchrones pour travailler avec le système de fichiers mais pas pour les méthodes d'assistance sur le type statique File. Ils sont sur FileStream.

Donc, il n'y a pas de File.ReadAllBytesAsync mais il y'à FileStream.ReadAsync, etc. Par exemple:

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

Il le fait déjà. Voir par exemple tilisation d'Async pour l'accès aux fichiers Article 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

Le framework .net dispose-t-il d'une bibliothèque/assemblage asynchrone qui permet de travailler avec le système de fichiers (par exemple File.ReadAllBytes, File.WriteAllBytes)?

Malheureusement, les API de bureau sont un peu irrégulières en ce qui concerne les opérations de fichiers asynchrones. Comme vous l'avez noté, un certain nombre de méthodes pratiques Nice n'ont pas d'équivalents asynchrones. Il manque également asynchrone ouverture de fichiers (ce qui est particulièrement utile lors de l'ouverture de fichiers sur un partage réseau).

J'espère que ces API seront ajoutées à mesure que le monde se déplacera vers .NET Core.

Ou dois-je écrire ma propre bibliothèque en utilisant les méthodes asynchrones de StreamReader et StreamWriter?

C'est la meilleure approche en ce moment.

Notez que lorsque vous utilisez ReadAsync/WriteAsync et vos amis, vous devez explicitement ouvrir le fichier pour un accès asynchrone. La seule façon de le faire (actuellement) est d'utiliser une surcharge de constructeur FileStream qui prend un bool isAsync paramètre (en passant true) ou FileOptions paramètre (en passant FileOptions.Asynchronous). Vous ne pouvez donc pas utiliser les méthodes ouvertes pratiques comme File.Open.

10
Stephen Cleary

Dans le noyau .NET (depuis la version 2.0), il existe désormais toutes les saveurs asynchrones des méthodes ReadAll/WriteAll/AppendAll correspondantes, telles que:

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

Malheureusement, ils manquent toujours à la norme .NET 2.0.

3
adospace