一尘不染

ZipArchive创建无效的ZIP文件

c#

我正在尝试从一个条目的代码创建一个新的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类有问题吗?


阅读 1028

收藏
2020-05-19

共1个答案

一尘不染

我在代码中发现了-回顾起来很明显的错误。必须 处理
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);
    }
}
2020-05-19