有人会解释为什么DotNetZip会在文件上旋转它的轮子吗?我有这个受版权保护且不可分发的文件,不会被压缩。我可以拿一个早期版本的文件,或者稍后一个版本,它会拉链。
zip实用程序不应该关心某个版本,因此我假设它认为该文件已损坏。我该如何调试此问题?当我单步执行代码时,问题不会发生,但如果我让它运行,它会在保存此特定文件时停止。这是图书馆的代码:
ICollection<ZipEntry> c = (SortEntriesBeforeSaving) ? EntriesSorted : Entries;
foreach (ZipEntry e in c) // _entries.Values
{
OnSaveEntry(n, e, true);
e.Write(WriteStream);
if (_saveOperationCanceled)
break;
n++;
OnSaveEntry(n, e, false);
if (_saveOperationCanceled)
break;
// Some entries can be skipped during the save.
if (e.IncludedInMostRecentSave)
thisSaveUsedZip64 |= e.OutputUsedZip64.Value;
}
如果我在该循环中放置一个断点并让它单独保存每个文件,那么当它看到“坏文件”时它不会窒息。
有什么想法?我将不胜感激!
编辑1:
为了清楚起见,当我说“扼流圈”时,我的意思是它会进入某种无限循环,并且不会继续压缩“坏文件”并转移到其余部分。此外,这是一个被很多人使用的文件,所以它不应该被破坏。
编辑2:
我把它缩小到以下几点:
zip.CompressionMethod = CompressionMethod.Deflate;
该压缩模式会导致此问题。我很确定这是某种错误。另一种压缩方法Bzip2非常慢。我不确定如何解决这个问题。
编辑3:
确实,DotNetZip非常奇怪。我通过调整压缩级别来修复它:zip.CompressionLevel = CompressionLevel.Default;
这解决了这个问题,但几分钟后我就回来了,它不再工作了。 Bzip2仍然有效,但就像我之前说过的那样,速度非常慢。所以,我开始搞乱ZipFile API的其他部分,我添加了这个:
zip.CodecBufferSize = 10240000;
这使它现在起作用。我不知道这个bug究竟是什么?