В моем коде есть следующий метод:
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
Код практически взят из образцов, но мне кажется, что-то не хватает. У кого-нибудь есть указатели?





У меня была аналогичная проблема, которую я решил, указав свойства CompressionMethod и CompressedSize в объекте ZipEntry. Однако при моем использовании zip создавался для группировки нескольких очень маленьких файлов в одну загрузку, а не для фактического сжатия файлов, поэтому я отказался от сжатия (уровень 0) и использовал фактический размер файла для свойства CompressedSize. Не уверен, как это будет работать, если сжатие необходимо.
Раньше я использовал 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);
}
Примерно с '09 SharpZipLib имеет эквивалентные API: добавить zip.BeginUpdate(), заменить zip.AddFile() на zip.Add() и zip.Save() на zip.CommitUpdate().
Однако DotNetZip не поддерживает переносимые проекты.
Для тех, у кого в будущем возникнет такая же проблема: моя проблема заключалась в том, что я использовал по-настоящему древнюю версию WinZip (я думаю, 8.0) для просмотра файлов. Использование современной программы просмотра (12.0) решило проблему.
См. Сообщение Тайлер Холмс
Проблема с 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 текущего выпуска не имеют проблемы.
Получаете ли вы такой же результат для других значений SetLevel?