ディレクトリを保持したまま、ファイルを Zip ファイルに追加しようとしています。以下のコードは、圧縮する数 100 Mb のファイルがない限り、基本的に機能します。約 250 Mb のファイルを 1 つ含むディレクトリを zip すると (メモリが十分にあるシステム上で)、その行で 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();
}
EDIT:Arkadiusz Kは、ライターではなくリーダーでフラッシュを使用したことは正しかった。それを変更した後、プログラムは最初に 100 Mb で停止した場所で 1 Gb 以上のファイルを圧縮します。ただし、たとえば 6 Gb ファイルを圧縮しようとすると、別の例外が発生します。次のように停止します: System.IO.IOException was unhandled Stream was too long Source=mscorlib StackTrace: at System.IO.MemoryStream.Write(Byte[] buffer 、Int32 オフセット、Int32 カウント) (など)
なぜまだ失敗するのか、誰にも分かりますか?コードは一度に 1 Kb を適切に読み書きする必要があると思いますか?