如何在zip文件中压缩多个文件

时间:2016-05-07 17:06:52

标签: c# asp.net .net file compression

我正在尝试将两个文本文件压缩为zip文件。这就是我的公共方法的样子:

public ActionResult Index()
{

    byte[] file1 = System.IO.File.ReadAllBytes(@"C:\file1.txt");
    byte[] file2 = System.IO.File.ReadAllBytes(@"C:\file2.txt");
    Dictionary<string, byte[]> fileList = new Dictionary<string, byte[]>();
    fileList.Add("file1.txt", file1);
    fileList.Add("file2.txt", file2);
    CompressToZip("zip.zip", fileList);

    return View();
}

这就是我的压缩方法的样子:

private void CompressToZip(string fileName, Dictionary<string, byte[]> fileList)
{
    using (var memoryStream = new MemoryStream())
    {
        foreach (var file in fileList)
        {
            using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
            {
                var demoFile = archive.CreateEntry(file.Key);

                using (var entryStream = demoFile.Open())
                using (var b = new BinaryWriter(entryStream))
                {
                    b.Write(file.Value);
                }
            }
        }

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

}

在这种方法中,完美地创建了zip文件夹。但问题是我在zip文件夹中只得到一个文件(只有第二个文件将在zip文件夹中创建)。 没有发现错误。

  

问题:如何将两个文本文件压缩到zip文件夹中?

先谢谢你了!

3 个答案:

答案 0 :(得分:10)

您的代码实际上将两个单独的zip存档保存到zip.zip文件(为每个要压缩的文件创建一个新的ZipArchive)。第一个zip存档仅包含file1.txt,仅包含file2.txt。在Windows资源管理器中打开zip.zip时,它只显示第二个zip存档的内容。

要创建包含这两个文件的单个zip存档,只需在ZipArchive循环之外移动fileList的创建:

using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
    foreach (var file in fileList)
    {                    
        var demoFile = archive.CreateEntry(file.Key);

        using (var entryStream = demoFile.Open())
        using (var b = new BinaryWriter(entryStream))
        {
            b.Write(file.Value);
        }
    }
}

答案 1 :(得分:6)

乍一看,我建议围绕AudioConverterFillComplexBuffer(audioConverterRef, AudioConverter_Callback, &convertInfo, &framesToDecode, &localPcmBufferList, nil)的{​​{1}}陈述是错误的。

这样,每次迭代foreach循环时都会创建一个新的using var (archive = new ZipArchive...)

当然,您想创建ZipArchive并循环浏览

中的foreach 吗?

像这样:

ZipArchive

希望这有帮助!

答案 2 :(得分:0)

string startPath = @"c:\example\start";
string zipPath = @"c:\example\result.zip";

ZipFile.CreateFromDirectory(startPath, zipPath);