MemoryStream を使用した ZIP アーカイブの作成
.NET でのデータ操作の興味深い側面の 1 つは、メモリ内でデータを操作できることです。このコンテキストでは、MemoryStream オブジェクトを使用してデータを保存し、ディスク上のファイルの動作を模倣することが一般的です。ただし、ZIP アーカイブの作成に関しては、MemoryStream の使用に関連する注意点があるようです。
次のシナリオを考えてみましょう: MemoryStream を使用して ZIP アーカイブを作成し、その後テキストへの書き込み操作を行う試みアーカイブ内のファイルを削除すると、テキスト ファイルが著しく欠落した不完全なアーカイブ ファイルが作成されます。ただし、FileStream を直接使用すると、アーカイブは正常に作成されます。この矛盾により、FileStream アプローチを避けて、MemoryStream を使用して ZIP アーカイブを作成できるかどうかという疑問が生じます。
その答えは、アーカイブの作成に使用される ZipArchive クラスの複雑さを理解することにあります。結局のところ、ZipArchive コンストラクターには追加パラメーター LeaveOpen があり、デフォルトは false です。このパラメータを 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!"); } } memoryStream.Seek(0, SeekOrigin.Begin); using (var fileStream = new FileStream("C:\Temp\test.zip", FileMode.Create)) { memoryStream.CopyTo(fileStream); } }
この変更されたコードでは、leaveOpen を true に設定すると、アーカイブを開いたままにすることができ、その後の Seek 操作により、メモリ内のアーカイブがファイル ストリームに書き込まれる準備が整います。完全な ZIP アーカイブ。このアプローチにより、MemoryStream の使用時にアーカイブ内でファイルが見つからない問題が解決されます。
以上がFileStream を使用せずに、.NET で MemoryStream を使用して ZIP アーカイブを作成できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。