Я пытаюсь добавить файлы в Zip-файл, сохранив каталог. Приведенный ниже код в основном работает до тех пор, пока у меня нет файлов размером в несколько 100 Мбайт для архивирования. Если я просто заархивирую каталог с одним файлом размером около 250 МБ (в системе с большим количеством памяти, кстати), я получу исключение OutOfMemory в строке write.Write()
.
Я уже изменил код для чтения по частям, поскольку он сначала не удался, когда я прочитал / записал весь файл. Я не знаю, почему до сих пор не удается?
using (FileStream zipToOpen = new FileStream(cZipName, eFileMode))
ZipArchiveEntry readmeEntry = archive.CreateEntry(cFileToBackup
);
using (BinaryWriter writer = new BinaryWriter(readmeEntry.Open()))
{
FileStream fsData = null; // Load file into FileStream
fsData = new FileStream(cFileFull, FileMode.Open, FileAccess.Read);
{
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = fsData.Read(buffer, 0, buffer.Length)) > 0)
{
writer.Write(buffer,0,bytesRead); // here it fails
fsData.Flush(); // ->CHANGED THIS TO writer.Flush() SOLVED IT - nearly..
}
}
fsData.Close();
}
РЕДАКТИРОВАТЬ: Аркадиуш К. был прав в том, что я использовал промывку для ридера, а не для писателя. После изменения этого параметра программа заархивирует файлы размером 1 Гб и более там, где сначала остановилась на 100 Мб. Однако я получаю другое исключение, когда пытаюсь заархивировать, например. файл размером 6 ГБ - он останавливается на: System.IO.IOException не обрабатывается Поток был слишком длинным Source = mscorlib StackTrace: в System.IO.MemoryStream.Write (буфер Byte [], смещение Int32, Int32 количество) (и т. д.)
Кто-нибудь знает, почему он все еще не работает? Я бы сказал, что код теперь должен правильно читать и писать по 1 КБ за раз?
x86
, вы должны помнить об адресном пространстве памяти, которое32-bit
приложение может использовать в адресном пространстве (это около 2 ГБ, но, насколько мне известно, оно может быть расширено некоторыми параметрами) - person Arkadiusz K   schedule 12.09.2015writer.Flush()
вместоfsData.Flush()
. Вы только читаете изFileStream
, а не пишете в него. - person Arkadiusz K   schedule 13.09.2015