使用 DotNetZip returns 损坏的存档压缩 pdf 文件

Compressing pdf files with DotNetZip returns damaged archive

我正在尝试使用 DotNetZip 压缩 2 个 pdf 文件,代码如下:

void Main()
{
    byte[] file1 = File.ReadAllBytes(@"C:\temp\a.pdf");
    byte[] file2 = File.ReadAllBytes(@"C:\temp\b.pdf");
    //byte[] file3 = File.ReadAllBytes(@"C:\temp\c.pdf");

    byte[] zip = Zipper.CreateZipFromFileContentList(new List<Tuple<string, byte[]>> { 
        new Tuple<string, byte[]>(@"a.pdf", file1),
        new Tuple<string, byte[]>(@"b.pdf", file2)//,
        //new Tuple<string, byte[]>(@"c.pdf", file3) 
    });
    File.WriteAllBytes(@"C:\temp\c.zip", zip);

    using(Ionic.Zip.ZipFile zipFile = Ionic.Zip.ZipFile.Read(@"C:\temp\c.zip"))
    {
        foreach(ZipEntry entry in zipFile)
        {
            entry.Extract(@"C:\temp\t");
        }
    }
}

// Define other methods and classes here
static class Zipper
{
    public static byte[] CreateZipFromFileContentList(IList<Tuple<string, byte[]>> fileContentList)
    {
        try
        {
            using (ZipFile zip = new ZipFile())
            {
                int i = 0;

                foreach (var item in fileContentList)
                {
                    ZipEntry entry = null;
                    entry = zip.AddEntry(item.Item1, item.Item2);
                    ++i;

                }
                MemoryStream ms = new MemoryStream();
                zip.Save(ms);
                return ms.GetBuffer();
            }
        }
        catch (Exception)
        {
            throw;
        }
    }
}

实际上一切正常,因为提取过程在创建存档后进行。但是,如果我尝试使用 winRar 打开 zip 文件,我会收到一条消息,提示存档已损坏。如果我尝试使用 7Zip,我会收到一条消息,说有超出有用块末尾的数据(已翻译,我不知道英文版是否给出了完全相同的消息)。

如果我压缩 1 或 3 个文件,我完全没有问题。 我该如何解决?

您的 zip 输出可能有额外的字节,因为 .GetBuffer() return 是流内部缓冲区 - 只有一部分包含有效数据。

改用.ToArray(),这将return仅使用缓冲区的部分。