我正在尝试从一个条目的代码创建一个新的ZIP包,并将ZIP包保存到文件中。我试图通过 System.IO.Compression.ZipArchive 类实现这一点。我正在使用以下代码创建ZIP包:
using (MemoryStream zipStream = new MemoryStream()) { using (ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create)) { var entry = zip.CreateEntry("test.txt"); using (StreamWriter sw = new StreamWriter(entry.Open())) { sw.WriteLine( "Etiam eros nunc, hendrerit nec malesuada vitae, pretium at ligula."); }
然后我将ZIP保存到WinRT中的文件中:
var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("test.zip", CreationCollisionOption.ReplaceExisting); zipStream.Position = 0; using (Stream s = await file.OpenStreamForWriteAsync()) { zipStream.CopyTo(s); }
或在普通的.NET 4.5中:
using (FileStream fs = new FileStream(@"C:\Temp\test.zip", FileMode.Create)) { zipStream.Position = 0; zipStream.CopyTo(fs); }
然而,我无法打开Windows资源管理器,WinRAR的等产生的文件既没有(我检查了生成的文件的大小zipStream的长度相匹配,所以流本身是正确保存到文件中。) 上午我做错了什么,或者ZipArchive类有问题吗?
我在代码中发现了-回顾起来很明显的错误。必须 处理 ZipArchive,以使其内容写入其基础流。因此,在ZipArchive的using块结束后,我不得不将流保存到文件中。 而且重要的是将其构造函数的 LeaveOpen 参数设置为true,以使其不关闭基础流。因此,这是完整的工作解决方案:
using (MemoryStream zipStream = new MemoryStream()) { using (ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create, true)) { var entry = zip.CreateEntry("test.txt"); using (StreamWriter sw = new StreamWriter(entry.Open())) { sw.WriteLine( "Etiam eros nunc, hendrerit nec malesuada vitae, pretium at ligula."); } } var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync( "test.zip", CreationCollisionOption.ReplaceExisting); zipStream.Position = 0; using (Stream s = await file.OpenStreamForWriteAsync()) { zipStream.CopyTo(s); } }