c# End of Central Directory record could not be found

匿名 (未验证) 提交于 2019-12-03 02:16:02

问题:

I am downloading a zip file using c# program and I get the error

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) 

Here's the program

    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();     } 

I do not understand the error. Can anybody explain this Thanks MR

回答1:

The problem is Unzip can't find the line of code that signals the end of the archive, so either:

  1. The archive is corrupt.
  2. It is not a .zip archive. (it may be a .rar or other compressed type)
  3. There is more than 1 part to the archive. (multi part zip)

Opening the file with your favorite zip utility will tell which of these it could be.



回答2:

From your old question you deleted.

I get System.IO.InvalidDataException: End of Central Directory record could not be found.

This most likely means whatever file you are passing in is malformed and the Zip is failing. Since you already have the file outfile on the hard drive I would recommend trying to open that file with with windows built in zip extractor and see if it works. If it fails the problem is not with your unzipping code but with the data the server is sending to you.



回答3:

I have the same problem, but in my case the problem is with the compression part and not with the decompression.

During the compression I need use the "Using" statament with the Stream and the ZipArchive objects too. The "Using" statament will Close the archive properly and I can decompress it without any problem.

The working code in my case in 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:

I encountered this same problem. There are many types of compression, .zip being only one of the types. Look and make sure that you aren't trying to 'unzip' a .rar or similar file.



回答5:

To Microsoft:

Instead of this stupid error message:

End of Central Directory record could not be found

Use this one:

Unzip can't find the line of code that signals the end of the archive, so either:

The archive is corrupt, it is not a .zip archive or there is more than one part to the archive

End of Central my ass :-)



回答6:

I used SharpCompress C#.net Library available via Nuget Package manager, it solved my purpose of unzipping.



回答7:

Might be useful to someone else. I dealt with this by adding an exception to my code, which then:

  1. Creates a temporary directory
  2. Extracts the zip archive (normally works)
  3. Renames the original ziparchive to *.bak
  4. Zips and replaces the original archive file with one that works


回答8:

I just came across this thread when I had the same error from a PowerShell script calling the Net.WebClient DownloadFile method.

In my case, the problem was that the web server was unable to provide the requested zip file, and instead provided an HTML page with an error message in it, which obviously could not be unzipped.

So instead, I created an exception handler to extract and present the "real" error message.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!