2008-11-25 2 views
4

У меня есть следующий метод в мой код:Основы SharpZipLib. Что мне не хватает?

private bool GenerateZipFile(List<FileInfo> filesToArchive, DateTime archiveDate) 
{ 
    try 
    { 
     using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(GetZipFileName(archiveDate)))) 
     { 
      zipStream.SetLevel(9); // maximum compression. 
      byte[] buffer = new byte[4096]; 

      foreach (FileInfo fi in filesToArchive) 
      { 
       string fileName = ZipEntry.CleanName(fi.Name); 
       ZipEntry entry = new ZipEntry(fileName); 
       entry.DateTime = fi.LastWriteTime; 
       zipStream.PutNextEntry(entry); 

       using (FileStream fs = File.OpenRead(fi.FullName)) 
       { 
        StreamUtils.Copy(fs, zipStream, buffer); 
       } 

       zipStream.CloseEntry(); 
      } 

      zipStream.Finish(); 
      zipStream.Close(); 
     } 
     return true; 
    } 
    catch (Exception ex) 
    { 
     OutputMessage(ex.ToString()); 
     return false; 
    } 
} 

Этот код генерирует ZIP-файл со всеми правильными записями, но каждый файл указан как 4 ТБ (как распакованы и упакованными) и создает следующее сообщение об ошибке когда я пытаюсь его открыть:

Extracting to "C:\winnt\profiles\jbladt\LOCALS~1\Temp\" 
Use Path: no Overlay Files: yes 
skipping: QPS_Inbound-20081113.txt: this file is not in the standard Zip 2.0 format 
    Please see www.winzip.com/zip20.htm for more information 
error: no files were found - nothing to do 

Код практически берется из образцов, но я, кажется, что-то пропускаю. У кого-нибудь есть указатели?

+0

Получаете ли вы тот же результат для других значений SetLevel? – devio 2008-11-25 18:54:57

ответ

7

Раньше я использовал SharpZipLib до тех пор, пока не перешел на DotNetZip. Вы можете проверить это как альтернативу.

Пример:

try 
    { 
    using (ZipFile zip = new ZipFile("MyZipFile.zip") 
    { 
     zip.AddFile("c:\\photos\\personal\\7440-N49th.png"); 
     zip.AddFile("c:\\Desktop\\2005_Annual_Report.pdf"); 
     zip.AddFile("ReadMe.txt"); 
     zip.Save(); 
    } 
    } 
    catch (System.Exception ex1) 
    { 
    System.Console.Error.WriteLine("exception: " + ex1); 
    } 
+0

Этот код намного проще. – Cheeso 2009-03-09 07:08:40

2

У меня была аналогичная проблема, которую я решил, указав свойства CompressionMethod и CompressedSize на объекте ZipEntry. В моем использовании, однако, zip создавался для группировки нескольких очень маленьких файлов в одной загрузке, а не для сжатия файлов, поэтому мне удалось избежать сжатия (уровень 0) и использовать фактический размер файла для свойства CompressedSize. Не уверен, как это будет работать, если сжатие необходимо.

0

В пользу тех, кто с той же проблемой в будущем: Моя проблема оказалась в том, что я использовал по-настоящему древнюю версию WinZip (8.0, я думаю), чтобы просмотреть файлы. Использование современного зрителя (12.0) решило проблему.

3

Посмотреть сообщение от Tyler Holmes

Вопрос с Winzip 8.0 и других, с ZIP64. Задайте исходный размер файла при добавлении ZipEntry, и ошибка исчезнет.

например.

string fileName = ZipEntry.CleanName(fi.Name); 
ZipEntry entry = new ZipEntry(fileName); 
entry.DateTime = fi.LastWriteTime; 
entry.Size = fi.Length; 
zipStream.PutNextEntry(entry); 

Утилиты с текущим выпуском zip не имеют проблемы.

Смежные вопросы