使用DotNetZip压缩pdf文件会返回损坏的存档

时间:2017-07-15 13:22:22

标签: c# dotnetzip

我正在尝试使用此代码使用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个文件,我完全没有问题。 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

使用.ToArray()而不是只返回缓冲区的已使用部分。