次のようにして、簡単なデモ テキスト ファイルを含む 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 が示唆しているように、チェックサムなどの最終バイトをアーカイブに書き込んで完了させるためである可能性があります。ただし、ストリームを閉じずに後で再利用できるようにするには、 のtrue
3 番目のパラメーターとしてを渡す必要がありますZipArchive
。