1

有人能解释为什么 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是什么?

4

0 回答 0