#c# #windows #uwp #stream
#c# #Windows #uwp #поток
Вопрос:
Мне нужно записать очень большой файл из моего приложения UWP, и я попытался сделать это, используя код, аналогичный следующему:
private async void btnWriteData_Click(object sender, RoutedEventArgs e)
{
FolderPicker pick = new FolderPicker();
pick.FileTypeFilter.Add(".bin");
StorageFolder folder = await pick.PickSingleFolderAsync();
StorageFile oFile = await folder.CreateFileAsync("ThisIsMyTest.bin");
long totBytes = 0;
using (var oStream = await oFile.OpenStreamForWriteAsync())
{
byte[] buffer = new byte[4194304];
long i = 0;
Random rnd = new Random();
while (i <= 8589934592){
rnd.NextBytes(buffer);
totBytes = buffer.Length;
Debug.WriteLine("totBytes: " totBytes.ToString() "/8789934592");
await oStream.WriteAsync(buffer,0,(int)buffer.Length);
}
}
Debug.WriteLine("Stop!");
}
Когда я нажимаю кнопку, связанную с этим событием, я наблюдаю за ходом операции.
Папка назначения находится на диске с большим количеством свободного места, но когда общий объем записанных байт достигает 4.294.967.296 байт, приложение запускает систему.Исключение, указывающее, что недостаточно свободного места (исключение из HRESULT: 0x80070070).
Это трассировка стека:
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.IO.BufferedStream.<WriteToUnderlyingStreamAsync>d__62.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MyApp.MainPage.<btnWriteData_Click>d__12.MoveNext() in C:UsersmatteDocumentsprojectxWindows10MyAppMainPage.xaml.cs:line 151
Я делаю что-то не так?
Есть ли способ записать файл размером более 4 ГБ с помощью streams?
Комментарии:
1. Единственное, что приходит на ум. Вы не используете FAT32 или используете?
2. Нет, конечно. Я использую NTFS.
3. Есть несколько вещей, которые можно было бы очистить, но, в частности, вы ничего не делаете
i
, кроме объявления, и ничего больше. Это огромная проблема, посколькуwhile
от этого зависит ваш цикл,while (i <= 8589934592)
это всегда будет верно…4. Да, я знаю это, потому что это просто код для проверки, могу ли я выйти за пределы 4 ГБ.
5. Не могли бы вы рассказать мне, какие платформы решений использует ваш проект? Вы можете попробовать переключиться на платформу x64, чтобы протестировать свой проект.