ли рамки .net имеют асинхра встроенной библиотеки/сборку, которая позволяет работать с файловой системой (например File.ReadAllBytes, File.WriteAllBytes)?
К сожалению, API-интерфейсы рабочего стола являются немного пятнистыми, когда речь заходит о асинхронных файловых операциях. Как вы отметили, ряд полезных методов удобства не имеет асинхронных эквивалентов. Также отсутствуют асинхронные открытие файлов (что особенно полезно при открытии файлов по сетевому ресурсу).
Я надеюсь, что эти API будут добавлены, когда мир перейдет на .NET Core.
Или мне нужно написать свою собственную библиотеку, используя методы async для StreamReader и StreamWriter?
Это лучший подход прямо сейчас.
Обратите внимание, что при использовании ReadAsync
/WriteAsync
и друзей, вы должны явно открыть файл для асинхронного доступа. Единственный способ сделать это (в настоящее время) - использовать перегрузку конструктора FileStream
, которая принимает параметр bool isAsync
(минус true
) или параметр FileOptions
(минус FileOptions.Asynchronous
). Таким образом, вы не можете использовать методы открытого доступа, такие как File.Open
.
Если файл, который вы сериализовали в поток байтов, был большим (3gb +), существует ли вероятность того, что длина потока будет иметь значение больше, чем тип int может хранить и блокировать его переполнением? – 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 не может быть заполнен весь массив. Вам нужно проверить возвращаемое значение, чтобы увидеть, сколько он _actually_ читает. – Phil