Проблема сжатия с большим архивом файлов в DotNetZip - PullRequest
4 голосов
/ 25 января 2011

Привет ....

Я пишу программу резервного копирования в c # 3.5, используя последнюю версию DotNetZip.Основы программы - указать местоположение на сервере и максимальный размер составного zip-файла и перейти.Оттуда он должен пройти через все папки / файлы из заданного местоположения и добавить их в архив, сохраняя точную структуру.Это должно также сжать все до разумного количества.Заданная несжатая коллекция папок / файлов может легко занимать 10-25 ГБ, а размер созданных составных файлов - около 1 ГБ каждая.

У меня все работает (используя DotNetZip).Моя единственная проблема заключается в том, что практически ничего не происходит.Я решил использовать метод «AddDirectory» для простоты кода и просто в целом, насколько хорошо он подходит для моего проекта.После прочтения я уже второй раз угадываю это решение.

  1. Учитывая приведенный ниже код и большое количество файлов в архиве, должен ли я сжимать каждый файл при его добавлении в zip-файл?или метод Adddirectory должен обеспечивать примерно такое же сжатие?

  2. Я пробовал каждый уровень сжатия, предлагаемый Ionic.Zlib.CompressionLevel, и, похоже, ни один из них не помог.Должен ли я подумать об использовании внешнего алгоритма сжатия и передать его в мой файл DotNetZip?

using (ZipFile zip = new ZipFile())  
{  
  zip.AddDirectory(root.FullName);  

  if (zipPassword.Length > 0)  
    zip.Password = zipPassword;  

  float size = zipGbSize * 1024 * 1024 * 1024;  

  zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;  
  zip.AddProgress += new EventHandler<AddProgressEventArgs>(Zip_AddProgress);  
  zip.ZipError += new EventHandler<ZipErrorEventArgs>(Zip_ZipError);  
  zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G");  
  zip.MaxOutputSegmentSize = (int)size;   //in gig  
  zip.Name = archiveDir.FullName + @"\Task_" + taskId.ToString() + ".zip";  
  zip.Save();  
}  

Спасибо за любую помощь!

Ответы [ 3 ]

2 голосов
/ 31 января 2011

1. Учитывая приведенный ниже код и большое количество файлов в архиве, следует ли мне сжимать каждый файл по мере его добавления в zip-файл?

Принцип работы DotNetZip заключается в сжатии каждого файла при его добавлении в архив.Ваше приложение не должно делать сжатие.DotNetZip делает это для вас.

или метод Adddirectory должен обеспечивать примерно такое же сжатие?

Записи, добавленные в zip-файл с помощью метода AddDirectory (), проходят по тому же пути кода, когда zipархив пишется, так как записи добавляются через AddFile ().Данные файла сжимаются, затем при желании шифруются, а затем записываются в zip-файл.


незапрошенный совет: вам не нужно делать:

zip.AddProgress += new EventHandler<AddProgressEventArgs>(Zip_AddProgress);   

вы можете просто сделать:

zip.AddProgress += Zip_AddProgress;   

как выопределить, что сжатие не происходит?

Если вас интересует сжатие каждой записи, вы можете зарегистрировать обработчик событий SaveProgress.Событие SaveProgress вызывается в разное время во время записи архива, в том числе когда начинается сохранение, когда DotNetZip начинает запись данных для одной записи, через различные промежутки времени во время записи одной записи, после завершения записи данных для каждой записи, ипосле окончания записи всех данных.Эти этапы и описаны в перечислении ZipProgressEventType .Когда EventType имеет значение Saving_AfterWriteEntry, вы можете рассчитать степень сжатия для данной записи.

Чтобы убедиться, что сжатие не происходит, я бы посоветовал вам зарегистрировать такое событие SaveProgress и посмотреть на эту степень сжатия.

Кроме того, как описано выше, некоторые типы файлов не могут быть сжаты.JPG, MPG, MP3, ZIP файлы и другие файлы не очень сжимаемы.


Наконец, сделать резервное копирование намного проще, если вы просто используете инструмент командной строки DotNetZip.Если все, что вы хотите сделать, это сделать резервную копию определенного каталога, вы можете использовать инструмент командной строки (zipit.exe) и избегать написания программы.С помощью инструмента zipit.exe, если вы используете опцию -v, инструмент печатает отчеты о ходе работы и отображает сжатие для каждой записи с помощью механизма, который я описал выше.Даже если вы предпочитаете писать свою собственную программу, вы можете рассмотреть возможность использования zipit.exe, чтобы проверить, происходит или нет сжатие при использовании DotNetZip.

2 голосов
/ 25 января 2011

Я не уверен, что занизил ваш вопрос, но максимальный размер для любого zip-файла его 4Gb . Возможно, вам придется создавать новый ZipFile каждый раз, когда вы достигаете этого предела.

Извините, если это вам не поможет.

1 голос
/ 25 января 2011

Какие данные вы сжимаете?Некоторые виды данных сжимаются не очень хорошо, например, JPEG или ZIP-файлы, которые уже сжаты.

...