DotNetZip душит файл - PullRequest
       29

DotNetZip душит файл

1 голос
/ 30 августа 2011

У кого-нибудь есть объяснение, почему 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 все еще работает, но, как я уже говорил, он невероятно медленный. Итак, я начал возиться с другими частями API ZipFile и добавил следующее:

zip.CodecBufferSize = 10240000;

Теперь это работает. Я не знаю, что это за ошибка на самом деле?

...