我正在尝试使用 MemoryStream
创建一个包含简单演示文本文件的 ZIP 存档,如下所示:
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))
{
// ...
}
是否可以在没有 FileStream
的情况下使用 MemoryStream
创建 ZIP 存档?
最佳答案
感谢ZipArchive creates invalid ZIP file ,我得到了:
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);
}
}
这表明我们需要在使用 ZipArchive
之前调用 Dispose
它完成了。但为了不关闭流,以便我们可以在您需要将 true
作为第三个参数传递给 ZipArchive
后重新使用它。
关于c# - 使用 System.IO.Compression 在内存中创建 ZIP 存档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17232414/