Конец записи центрального каталога не найден
Я загружаю 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 не может найти строку кода, которая сигнализирует об окончании архива, так что либо:
- Архив поврежден.
-
Это не архив ZIP.
- Это может быть .rar или другой сжатый тип. Или, как я подозреваю, вы загружаете html файл, который автоматически перенаправляет в zip файл.
- В архиве более 1 части.
- Многочастный почтовый файл.
- Как отмечает @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
Может быть полезным для кого-то еще. Я справился с этим, добавив исключение в мой код, который затем:
- Создает временный каталог
- Извлекает zip архив (нормально работает)
- Переименовывает оригинальный ziparchive в *.bak
- Zips и заменяет оригинальный файл архива на тот, который работает