System.IO.Compression を使用してメモリ内に ZIP アーカイブを作成する 質問する

System.IO.Compression を使用してメモリ内に ZIP アーカイブを作成する 質問する

次のようにして、簡単なデモ テキスト ファイルを含む ZIP アーカイブを作成しようとしていますMemoryStream

using (var memoryStream = new MemoryStream())
using (var archive = new ZipArchive(memoryStream , ZipArchiveMode.Create))
{
    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))
    {
        stream.CopyTo(fileStream);
    }
}

このコードを実行すると、アーカイブ ファイル自体は作成されますが、foo.txt は作成されません。

MemoryStreamただし、 をファイル ストリームに直接置き換えると、アーカイブは正しく作成されます。

using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create))
using (var archive = new ZipArchive(fileStream, FileMode.Create))
{
    // ...
}

MemoryStreamを使用せずに ZIP アーカイブを作成することは可能ですかFileStream?

ベストアンサー1

ZipArchive が無効な ZIP ファイルを作成するため、次のようになりました:

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);
   }
}

Disposeこれは、使用する前にを呼び出す必要があることを示していますZipArchive。これは、Amir が示唆しているように、チェックサムなどの最終バイトをアーカイブに書き込んで完了させるためである可能性があります。ただし、ストリームを閉じずに後で再利用できるようにするには、 のtrue3 番目のパラメーターとしてを渡す必要がありますZipArchive

おすすめ記事