MemoryStream を使用してメモリ内に ZIP アーカイブを作成する: 空のエントリの問題を解決する
MemoryStream を使用してメモリ内に ZIP アーカイブを作成しようとした場合開発者は、対応するテキスト ファイルが書き込まれているにもかかわらず、作成されたアーカイブに空のファイルが含まれるという特有の問題に遭遇しました。この動作は、プロセス内のステップが欠落していることが原因です。
この問題を解決するには、基盤となるストリームにアクセスする前に、ZipArchive オブジェクトに対して Dispose を呼び出すことが重要です。 ZipArchive がアーカイブのチェックサムに最終バイトを書き込み、アーカイブを完成させるため、この作業が必要になります。ただし、ストリームを開いたままにしてさらに使用したい場合は、ZipArchive の 3 番目のパラメータとして true を渡す必要があります。
このソリューションを組み込んだ修正されたコード スニペットは次のとおりです。
using (var memoryStream = new MemoryStream()) { using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) { var demoFile = archive.CreateEntry("foo.txt"); using (var entryStream = demoFile.Open()) using (var streamWriter = new StreamWriter(entryStream)) { streamWriter.Write("Bar!"); } } using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create)) { memoryStream.Seek(0, SeekOrigin.Begin); memoryStream.CopyTo(fileStream); } }
このアプローチに従うことで、開発者は空のエントリの問題に遭遇することなく、MemoryStream を使用してメモリ内に完全な ZIP アーカイブを正常に作成できます。
以上がMemoryStream を使用してインメモリ ZIP アーカイブを作成するときに空のエントリを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。