Конец записи центрального каталога не найден

Я загружаю zip файл с помощью программы С#, и я получаю сообщение об ошибке

at System.IO.Compression.ZipArchive.ReadEndOfCentralDirectory()
   at System.IO.Compression.ZipArchive.Init(Stream stream, ZipArchiveMode mode,
Boolean leaveOpen)
   at System.IO.Compression.ZipArchive..ctor(Stream stream, ZipArchiveMode mode,
 Boolean leaveOpen, Encoding entryNameEncoding)
   at System.IO.Compression.ZipFile.Open(String archiveFileName, ZipArchiveMode
mode, Encoding entryNameEncoding)
   at System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileN
ame, String destinationDirectoryName, Encoding entryNameEncoding)
   at System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileN
ame, String destinationDirectoryName)

Здесь программа

    response = (HttpWebResponse)request.GetResponse();
    Stream ReceiveStream = response.GetResponseStream();
    byte[] buffer = new byte[1024];
    FileStream outFile = new FileStream(zipFilePath, FileMode.Create);
    int bytesRead;
    while ((bytesRead = ReceiveStream.Read(buffer, 0, buffer.Length)) != 0)
        outFile.Write(buffer, 0, bytesRead);
    outFile.Close();
    response.Close();
    try
    {
        ZipFile.ExtractToDirectory(zipFilePath, destnDirectoryName);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
        Console.ReadLine();
    }

Я не понимаю ошибку. Может кто-нибудь объяснить это благодаря MR

Ответ 1

Проблема в том, что Unzip не может найти строку кода, которая сигнализирует об окончании архива, так что либо:

  1. Архив поврежден.
  2. Это не архив ZIP.

    • Это может быть .rar или другой сжатый тип. Или, как я подозреваю, вы загружаете html файл, который автоматически перенаправляет в zip файл.
  3. В архиве более 1 части.
    • Многочастный почтовый файл.
  4. Как отмечает @ElliotSchmelliot в комментариях, файл может быть скрыт или иметь расширенные символы в имени.

Открытие файла с помощью вашей любимой zip-утилиты покажет, какой из них это может быть.

Ответ 2

Из старого вопроса, который вы удалили.

Я получаю System.IO.InvalidDataException: Не удалось найти запись в Центральном каталоге.

Это, скорее всего, означает, что любой файл, который вы передаете, искажен и Zip не работает. Так как у вас уже есть файл outfile на жестком диске, я бы рекомендовал открыть этот файл с помощью окон, созданных в zip-экстракторе, и посмотреть, работает ли он. Если это не удается, проблема заключается не в вашем распакованном коде, а в том, что данные передаются вам сервером.

Ответ 3

У меня такая же проблема, но в моем случае проблема связана с частью сжатия, а не с декомпрессией.

Во время сжатия мне нужно использовать "Использование" statament с объектами Stream и ZipArchive. "Использование" statament закроет архив правильно, и я могу без проблем распаковать его.

Рабочий код в моем случае в VB.Net:

Using zipSteramToCreate As New MemoryStream()
    Using archive As New ZipArchive(zipSteramToCreate, ZipArchiveMode.Create)
        ' Add entry...
    End Using

    ' Return the zip byte array for example:
    Return zipSteramToCreate.ToArray
End Using

Ответ 4

Я столкнулся с этой же проблемой. Существует много типов сжатия,.zip - только один из типов. Посмотрите и убедитесь, что вы не пытаетесь "распаковать".rar или аналогичный файл.

Ответ 5

Microsoft:

Вместо этого глупого сообщения об ошибке:

Не удалось найти завершение записи Центрального каталога

Используйте это:

Unzip не может найти строку кода, которая сигнализирует о завершении архива, так что:

Архив поврежден, он не является архивом .zip или не более одного часть к архиву

Конец Центральной моей задницы: -)

Ответ 6

Я только сталкивался с этой темой, когда у меня была та же ошибка от сценария PowerShell, вызывающего метод DownloadFile Net.WebClient.

В моем случае проблема заключалась в том, что веб-сервер не смог предоставить запрошенный zip файл и вместо этого предоставил HTML-страницу с сообщением об ошибке, которое, очевидно, нельзя было разархивировать.

Поэтому вместо этого я создал обработчик исключений для извлечения и представления "реального" сообщения об ошибке.

Ответ 7

Я использовал библиотеку SharpCompress С#.net, доступную через диспетчер пакетов Nuget, она решила мою задачу распаковки.

Ответ 8

Может быть полезным для кого-то еще. Я справился с этим, добавив исключение в мой код, который затем:

  1. Создает временный каталог
  2. Извлекает zip архив (нормально работает)
  3. Переименовывает оригинальный ziparchive в *.bak
  4. Zips и заменяет оригинальный файл архива на тот, который работает