2016-03-02 18 views
13

是否.NET框架具有async內置庫/組件,其允許與文件系統(例如File.ReadAllBytesFile.WriteAllBytes)工作?.net框架是否提供使用文件系統的異步方法?

或者我必須使用async編寫我自己的圖書館方法StreamReaderStreamWriter

像這樣的東西是相當不錯的:

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

回答

13

是否.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); 
} 
+0

如果你正在序列化成一個字節流的文件很大(3gb +)是否有可能流的長度實際上大於int類型可以存儲並溢出溢出? – Dave

+1

@Dave可能。在這種情況下,您可能需要閱讀大塊文件。 – i3arnon

+0

無論如何你都應該有邏輯讀入塊。根據[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不能保證填充整個陣列。您需要檢查返回值以查看它實際讀取的值。 – Phil

11

它已經這樣做了。參見例如Using 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); 
    }; 
} 
-7

如果你必須寫在一個後臺任務一個文件,你可以在異步方法sincronously寫。

static void Main(string[] args) 
{ 
    Console.WriteLine("1"); 
    // thread 1, sync 
    byte[] dataToWrite = System.Text.ASCIIEncoding.ASCII.GetBytes("my custom data"); 
    Task.Run(() => 
    { 
     Console.WriteLine("2"); 
     // aspetto un secondo 
     System.Threading.Thread.Sleep(1000); 
     // thread 2, async code 
     System.IO.File.WriteAllBytes(@"c:\temp\prova.txt", dataToWrite); 
     Console.WriteLine("2, end"); 
    }); 

    Console.WriteLine("3, exit"); 

    Console.ReadLine(); 
    // thread 1 
} 

執行輸出將是:-1,3,2端

+5

這不是異步的,也是一個非常糟糕的建議。 – i3arnon

+0

您不等待該任務。另外,這很難使用IOCP – MickyD

+0

爲什麼它不是異步對不起?如果您必須在後臺編寫而不用等待寫入結束,則可以使用它 –

4

是否.NET框架有/內置庫異步組件,其允許與文件系統的工作(例如File.ReadAllBytes,File.WriteAllBytes)?

不幸的是,當涉及到異步文件操作時,桌面API有點多餘。正如你所指出的,許多不錯的便利方法沒有異步等價物。還缺少異步文件開放(這在通過網絡共享打開文件時特別有用)。

我希望這些API將成爲全球移動到.NET的核心加入。

或者我必須使用StreamReader和StreamWriter的異步方法編寫自己的庫嗎?

那現在是最好的辦法。

請注意,當使用ReadAsync/WriteAsync和朋友時,您必須明確地打開該文件進行異步訪問。要做到這一點(目前)的唯一方法是使用FileStream構造函數重載接受一個bool isAsync參數(傳遞true)或FileOptions參數(傳遞FileOptions.Asynchronous)。所以你不能使用便利的開放方法,如File.Open

+1

感謝您的信息,特別是:'FileOptions.Asynchronous'謝謝! 'isAsync'似乎被刪除。 +1 – BendEg

相關問題