Основы SharpZipLib. Что мне не хватает? - PullRequest
4 голосов
/ 25 ноября 2008

В моем коде есть следующий метод:

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

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

Ответы [ 4 ]

7 голосов
/ 25 ноября 2008

Я использовал 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);
   }
3 голосов
/ 13 декабря 2008

см. Сообщение Тайлер Холмс

Проблема с 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 с выпуском нет проблемы.

2 голосов
/ 25 ноября 2008

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

0 голосов
/ 04 декабря 2008

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

...