是否.NET框架具有async
內置庫/組件,其允許與文件系統(例如File.ReadAllBytes
,File.WriteAllBytes
)工作?.net框架是否提供使用文件系統的異步方法?
或者我必須使用async
編寫我自己的圖書館方法StreamReader
和StreamWriter
?
像這樣的東西是相當不錯的:
var bytes = await File.ReadAllBytes("my-file.whatever");
是否.NET框架具有async
內置庫/組件,其允許與文件系統(例如File.ReadAllBytes
,File.WriteAllBytes
)工作?.net框架是否提供使用文件系統的異步方法?
或者我必須使用async
編寫我自己的圖書館方法StreamReader
和StreamWriter
?
像這樣的東西是相當不錯的:
var bytes = await File.ReadAllBytes("my-file.whatever");
是否.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);
}
它已經這樣做了。參見例如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);
};
}
如果你必須寫在一個後臺任務一個文件,你可以在異步方法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端
是否.NET框架有/內置庫異步組件,其允許與文件系統的工作(例如File.ReadAllBytes,File.WriteAllBytes)?
不幸的是,當涉及到異步文件操作時,桌面API有點多餘。正如你所指出的,許多不錯的便利方法沒有異步等價物。還缺少異步文件開放(這在通過網絡共享打開文件時特別有用)。
我希望這些API將成爲全球移動到.NET的核心加入。
或者我必須使用StreamReader和StreamWriter的異步方法編寫自己的庫嗎?
那現在是最好的辦法。
請注意,當使用ReadAsync
/WriteAsync
和朋友時,您必須明確地打開該文件進行異步訪問。要做到這一點(目前)的唯一方法是使用FileStream
構造函數重載接受一個bool isAsync
參數(傳遞true
)或FileOptions
參數(傳遞FileOptions.Asynchronous
)。所以你不能使用便利的開放方法,如File.Open
。
感謝您的信息,特別是:'FileOptions.Asynchronous'謝謝! 'isAsync'似乎被刪除。 +1 – BendEg
如果你正在序列化成一個字節流的文件很大(3gb +)是否有可能流的長度實際上大於int類型可以存儲並溢出溢出? – Dave
@Dave可能。在這種情況下,您可能需要閱讀大塊文件。 – i3arnon
無論如何你都應該有邏輯讀入塊。根據[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