无法找到中央目录结束记录

时间:2014-01-06 22:21:21

标签: c# zipfile

我正在使用c#程序下载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

10 个答案:

答案 0 :(得分:26)

问题是解压缩无法找到表示存档结束的代码行,因此:

  1. 存档已损坏。

    • 解决方案 - 存档需要修复。
  2. 它不是.zip存档。

    • 它可能是.rar或其他压缩类型。或者我在这里怀疑,你正在下载一个自动重定向到zip文件的html文件。
    • 解决方案 - 找到一个正确的存档来使用此代码。
  3. 存档有1个以上的部分。
    • 多部分zip文件。
    • 解决方案 - 在解压缩之前读入所有文件。
  4. 正如@ElliotSchmelliot在评论中指出的那样,文件可能是隐藏的,或者名称中包含扩展字符。
    • 解决方案 - 检查文件属性/权限并验证文件名。
  5. 使用您喜欢的zip实用程序打开文件将告诉它们可能是哪一个。

答案 1 :(得分:12)

从您删除的旧问题。

  

我收到System.IO.InvalidDataException:找不到中央目录记录的结尾。

这很可能意味着您传入的文件格式不正确且Zip失败。由于您已经在硬盘驱动器上安装了文件outfile,我建议尝试使用带有zip解压缩程序的Windows打开该文件,看看它是否有效。如果失败,问题不在于您的解压缩代码,而在于服务器发送给您的数据。

答案 2 :(得分:6)

我遇到了同样的问题,但在我的情况下,问题在于压缩部分,而不是解压缩。

在压缩过程中,我需要使用"使用"与Stream和ZipArchive对象的statament也是如此。 "使用" 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

答案 3 :(得分:3)

我遇到了同样的问题。有许多类型的压缩,.zip只是其中一种类型。查看并确保您没有尝试“解压缩”.rar或类似文件。

答案 4 :(得分:1)

当我从调用Net.WebClient DownloadFile方法的PowerShell脚本遇到同样的错误时,我刚遇到这个帖子。

在我的情况下,问题是Web服务器无法提供所请求的zip文件,而是提供了一个HTML页面,其中包含错误消息,显然无法解压缩。

相反,我创建了一个异常处理程序来提取和呈现" real"错误信息。

答案 5 :(得分:1)

在我的情况下,我绝对知道我的zip文件未损坏,并且通过反复试验,我发现我正在将文件提取到文件夹名称为FOLDER Name的目录中。

因此将/tmp/data.zip解压缩到:

/tmp/staging/data.zip/files_go_here

失败,并显示错误消息[找不到中央目录记录的结尾]

但是将data.zip提取到这个文件就可以了:

/ tmp / staging / data / files_go_here

虽然在某些人中将文件夹命名为带有扩展名的文件名似乎很不寻常,但我无法想到您为什么不能执行此操作的单个原因,更重要的是,返回的错误并不明显与原因有关。

System.IO.Compression库和SharpPipLib之类的第三方软件包都遇到了相同的错误-最终使我明白这是一个更普遍的问题。

我希望这可以帮助某人并为他们节省一些时间/沮丧。

答案 6 :(得分:0)

我使用通过Nuget包管理器提供的SharpCompress C#.net库,它解决了我解压缩的目的。

答案 7 :(得分:0)

可能对其他人有用。我通过在代码中添加一个异常处理了这个问题,然后:

  1. 创建临时目录
  2. 提取zip存档(通常可以正常工作)
  3. 将原始ziparchive重命名为* .bak
  4. 使用工作
  5. 的Zips并替换原始存档文件

答案 8 :(得分:0)

将流写入文件,然后使用(十六进制)编辑器对其进行检查。
 从nuget.org下载nupkg时,我在Visual Studio中得到了相同的消息。这是因为nuget.org被防火墙列入了黑名单。因此,代替了pkg,我得到了一个HTML错误页面,该页面(当然)不能解压缩。

答案 9 :(得分:-1)

我找到了解决方法。

移动“工具-> Nuget PackageManager->软件包管理器设置”,然后在“ Nuget Package Manager”-“常规”选项卡中,单击“清除所有Nuget缓存”按钮,然后单击“确定”。您可以从网上安装软件包