MemoryStream を使用してメモリ内に ZIP アーカイブを作成する
MemoryStream を使用してメモリ内に ZIP アーカイブを作成しようとすると、次のようなシナリオが発生する可能性があります。アーカイブ ファイルは生成されますが、予期されたコンテンツ ファイルがありません。 MemoryStream を FileStream に置き換えると、問題が解決します。しかし、FileStream に頼らずに、MemoryStream を ZIP アーカイブの作成に利用することは可能でしょうか?
解決策は、ZipArchive の内部動作を理解することにあります。アーカイブが完了したとみなされる前に、チェックサムなどの特定の重要なバイトを書き込む必要があります。デフォルトでは、ZipArchive はストリームを閉じてこの操作を実行しますが、MemoryStream の場合、このアクションによりその後のストリームの使用が妨げられます。
これを克服するには、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 アーカイブを正常に作成できます。
以上がFileStream を使用せずに MemoryStream を使用してメモリ内に ZIP アーカイブを作成できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。