使用 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仅使用缓冲区的部分。
我正在尝试使用 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仅使用缓冲区的部分。