为了测试某件事,我需要使用ZipArchive
创建一个归档文件,而不是创建一个byte[]
甚至更好的文件,而不是Stream
。我发现下面的示例开始于:
using (FileStream zipToOpen = new FileStream(@"c:\users\exampleuser\release.zip", FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
{
ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt");
using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
{
writer.WriteLine("Information about this package.");
writer.WriteLine("========================");
}
}
}
如果将FileStream
替换为MemoryStream
,我将无法获得结果。这是因为ZipArchive
和StreamWriter
“使用”在处置时会关闭流。另一方面,如果我不使用这些“用法”,则归档似乎已损坏,因为在尝试取消归档时出现错误。在我看来,存档已在ZipArchive
处置中完成。
您可以通过这种方式退出MemoryStream的使用块之前获取它的内容
using (MemoryStream zipToOpen = new MemoryStream())
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
{
ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt");
using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
{
writer.WriteLine("Information about this package.");
writer.WriteLine("========================");
}
}
// At this point the StreamWriter is closed, the ZipArchive is disposed
// but the MemoryStream buffer is still available and we can get it
byte[] buffer = zipToOpen.GetBuffer();
// Just a test to check if we have a correct "zip" buffer.
File.WriteAllBytes(@"e:\temp\ziparchive.zip", buffer);
}