web-dev-qa-db-ja.com

中央ディレクトリの終わりのレコードが見つかりませんでした

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に説明できますか

33
user2726975

問題は、Unzipがアーカイブの終了を示すコード行を見つけられないため、次のいずれかです。

  1. アーカイブが破損しています。

    • 解決策-アーカイブを修復する必要があります。
  2. .Zipアーカイブではありません。

    • .rarまたはその他の圧縮タイプの場合があります。または、ここで疑うように、Zipファイルに自動リダイレクトするHTMLファイルをダウンロードしています。
    • 解決策-このコードを使用する正しいアーカイブを見つけてください。
  3. アーカイブには複数の部分があります。
    • マルチパートZipファイル。
    • 解決策-解凍前にすべてのファイルを読み込みます。
  4. @ElliotSchmelliotがコメントで述べているように、ファイルは隠されているか、名前に拡張文字が含まれている可能性があります。
    • 解決策-ファイルの属性/アクセス許可を確認し、ファイル名を確認します。

お気に入りのZipユーティリティでファイルを開くと、これらのファイルがどれであるかがわかります。

27
paqogomez

削除した古い質問から。

System.IO.InvalidDataExceptionが発生します:中央ディレクトリレコードの終わりが見つかりませんでした。

これはおそらく、渡そうとしているファイルの形式が正しくなく、Zipが失敗していることを意味します。既にハードドライブにファイルoutfileがあるので、Zipエクストラクタに組み込まれたウィンドウでそのファイルを開き、動作するかどうかを確認することをお勧めします。失敗した場合、問題は解凍コードではなく、サーバーから送信されたデータにあります。

14

私は同じ問題を抱えていますが、私の場合、問題は圧縮部分にあり、解凍にはありません。

圧縮中に、StreamオブジェクトとZipArchiveオブジェクトでも「Using」ステートメントを使用する必要があります。 「使用」文はアーカイブを適切に閉じ、問題なく解凍できます。

私の場合、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
6
SZL

この同じ問題が発生しました。圧縮には多くのタイプがあり、.Zipはそのタイプの1つにすぎません。 .rarなどのファイルを「解凍」しようとしていないことを確認してください。

3
Roger Hill

Net.WebClient DownloadFileメソッドを呼び出すPowerShellスクリプトから同じエラーが発生したときに、このスレッドに出会ったばかりです。

私の場合、問題はWebサーバーが要求されたZipファイルを提供できず、代わりにエラーメッセージを含むHTMLページを提供し、明らかに解凍できないことでした。

その代わりに、例外ハンドラを作成して、「実際の」エラーメッセージを抽出して表示します。

1
paulf

他の誰かに役立つかもしれません。これに対処するには、コードに例外を追加します。

  1. 一時ディレクトリを作成します
  2. Zipアーカイブを抽出します(通常は機能します)
  3. 元のziparchiveの名前を* .bakに変更します
  4. 元のアーカイブファイルを圧縮して、機能するファイルに置き換えます
0
user3899886

Nuget Package Managerから入手可能なSharpCompress C#.net Libraryを使用して、解凍の目的を解決しました。

0
Raghu