У кого-нибудь есть объяснение, почему 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;
Теперь это работает. Я не знаю, что это за ошибка на самом деле?