使用C#创建包含多个文件的ZIP归档

9
我正在尝试创建一个包含多个文本文件的ZIP归档文件,具体操作如下:
Dictionary<string, string> Values = new Dictionary<string, string>();
using (var memoryStream = new MemoryStream())
{
    string zip = @"C:\Temp\ZipFile.zip";
    foreach (var item in Values)
    {
        using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
        {
            var file = archive.CreateEntry(item.Key + ".txt");
            using (var entryStream = file.Open())
            using (var streamWriter = new StreamWriter(entryStream))
            {
                streamWriter.Write(item.Value);
            }
        }
    }
    using (var fileStream = new FileStream(zip, FileMode.Create))
    {
        memoryStream.Seek(0, SeekOrigin.Begin);
        memoryStream.CopyTo(fileStream);
    }
}

然而,ZIP 文件只包含了最后一个文本文件,这是怎么回事?
2个回答

16

您在每个迭代中都创建了ZipArchive。交换 foreach和 using应该解决它:

Dictionary<string, string> Values = new Dictionary<string, string>();
using (var memoryStream = new MemoryStream())
{
    string zip = @"C:\Temp\ZipFile.zip";
    using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
    {
        foreach (var item in Values)
        {
            var file = archive.CreateEntry(item.Key + ".txt");
            using (var entryStream = file.Open())
            using (var streamWriter = new StreamWriter(entryStream))
            {
                streamWriter.Write(item.Value);
            }
        }
    }

    using (var fileStream = new FileStream(zip, FileMode.Create))
    {
        memoryStream.Seek(0, SeekOrigin.Begin);
        memoryStream.CopyTo(fileStream);
    }
}

1
每次foreach循环运行时,ZipArchiveMode都是Create。这应该就是问题所在,因此它每次都会生成一个新的zip文件,并将其中包含新的内容,例如最后一个文本文件。在第一次循环运行之后为每个循环运行创建一个异常,问题就会得到解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接