中断したダウンロードの ZIP

途中で止まったダウンロードは ZIP を壊す(かき混ぜる)わけではなく、切り詰める(トランケートする)だけです。ファイル末尾のインデックス(セントラルディレクトリ)が届かなかったため、先に保存されたファイルがまだ残っていても、展開ツールはアーカイブ全体を拒否します。そうしたファイルを取り戻すのは、アーカイブを先頭から読むだけの話で、サーバーに渡す必要はありません。

ファイルがデバイスから出ることはありません — 修復はブラウザ内で実行されます。アップロードは 0 バイトです。

Your data is the big block — usually intact. What breaks is the small index. Repair rebuilds it.

Drop a file here or browseTap to choose a file

ZIP · Office · PDF · video · JPG · PNG · RAR/7z · SQLite — repaired right here in your browser. Nothing is uploaded

0 bytes uploadedFree: 3 repairs/day — up to 500 MB video, 100 MB docs & archives, 50 MB photos. Free download. Single repair €5.90. No account required.

今すぐ修復

  1. ファイルをドロップ
  2. 修復はローカルで実行
  3. 結果をダウンロード

ブラウザのダウンロード、クラウドの「すべてダウンロード」、あるいは不安定な接続からのコピーが最後の 1 バイトまで届く前に止まると、ディスクに残る .zip切り詰められた(truncated)状態 — サーバーが意図したよりも短くなります。WinRAR と 7-Zip は "Unexpected end of archive"(アーカイブが予期せず終了)、Info-ZIP の unzip は "End-of-central-directory signature not found"(セントラルディレクトリの終端シグネチャが見つからない)、Windows のエクスプローラーは "The Compressed (zipped) Folder is invalid"(圧縮フォルダーが無効)と表示し、Python の zipfileBadZipFile: File is not a zip file を投げます。どれも反応しているのは同じこと — ファイル末尾にあるインデックスが失われている、という一点です。上のエリアに部分的なアーカイブをドロップすると、ツールは欠けたインデックスを無視し、ブラウザ内で先頭からエントリを走査して、切断より前に完全に書き込まれたすべてのファイルを取り出します — アップロードは一切ありません。

中断したダウンロードが ZIP を壊す理由

ZIP は先頭から末尾へ書き込まれますが、読むときは末尾から先頭へ向かって読みます。追加した各ファイルは ローカルファイルエントリとして格納されます — シグネチャ PK\x03\x04 で始まるヘッダーに、名前、圧縮方式(0 = 無圧縮 stored、8 = deflate)、そしてその後に圧縮バイトが続きます。しかし、それらのエントリがどこにあるかを示す正式なインデックスは、最後に書き込まれる セントラルディレクトリ(PK\x01\x02 レコード)で、22 バイトの End Of Central Directory レコード PK\x05\x06 の直前に置かれます。展開ツールはファイルを開くときに末尾へシークし、その PK\x05\x06 シグネチャを求めて後方へ走査します — レコードが可変長のコメントフィールドで終わるため、およそ 65,557 バイト手前まで遡ります。EOCD を見つけて初めて、アーカイブが何個のエントリを持ち、各セントラルディレクトリレコードがどこから始まるかがわかります。

ここで、70% で止まったダウンロードを思い浮かべてください。届かなかったバイトは、最後に書き込まれるもの — セントラルディレクトリと EOCD です。展開ツールは末尾へシークし、後方へ走査しますが、PK\x05\x06 をついに見つけられず、ファイルを 1 つも触らないうちに諦めます。これこそが、unzip の "End-of-central-directory signature not found"、7-Zip と WinRAR の "Unexpected end of archive"、エクスプローラーの "The Compressed (zipped) Folder is invalid"、macOS のアーカイブユーティリティの "Unable to expand … (Error 2)" の正確な原因です。どれも、保存されたファイルがかき混ぜられていることを意味しません — 末尾にある目次が失われている、ということを意味します。

中断したダウンロードが特にこの問題を起こしやすいのは、多くの ZIP がどう生成されるかに関係しています。サーバーがその場で組み立てるアーカイブ — クラウドストレージの「すべてダウンロード」、GitHub のソース tarball に並ぶ ZIP 版、エクスポート用のバンドルなど — は、たいてい ストリーミングで送られます。汎用ビットフラグのビット 3(0x0008)が立てられ、各ローカルヘッダーの圧縮サイズと CRC-32 はゼロのまま残され、本来の値はエントリのデータの後に データデスクリプタ(PK\x07\x08)として付け加えられます。そうしたアーカイブでは、サイズが保証される場所はセントラルディレクトリだけなので、末尾を失うと通常の展開ツールにとって二重の打撃になります。ブラウザが残した書きかけのファイル — Chrome/Edge の .crdownload、Firefox の .part、あるいは単にレスポンスの Content-Length より短い .zip — には、切断までのすべての完全なエントリが含まれ、それ以降は何も含まれません。

前方走査が部分的な ZIP から復元できるもの

この救出処理は、欠けたインデックスをまったく必要としません。ZIP では各ローカルエントリが自己記述的だからです。ツールは末尾へシークする代わりに、オフセット 0 から前方へ走査し、見つけた各 PK\x03\x04 ローカルヘッダーで止まって、ファイル名と圧縮方式を読み取り、続く deflate ストリームを展開します。deflate は自己終端型です — ストリームはブロックの並びで、最後のブロックは BFINAL ビットが 1 に設定されているので、ストリーミング書き込みによってローカルヘッダーのサイズフィールドがゼロのまま残されていても、デコーダはエントリのデータがどこで終わるかを見つけられます。ストリームがきれいに終端すると、ツールは復元したファイルを記録し、末尾のデータデスクリプタ PK\x07\x08 があればそれを飛ばして、次の PK\x03\x04 へ進みます。これはあなたのタブ内で純粋な TypeScript として動作します — unzip バイナリも不要で、何も送信されません。

その結果、中断より前に完全に書き込まれたすべてのファイルが、元の名前とディレクトリのパスとともに、順番どおりに戻ってきます。10 個中 4 番目のファイルの途中でダウンロードが途絶えた場合、最初の 3 個は無傷で得られ、4 番目は部分的になるか失われます。届かなかった 6 個を呼び戻すことはできませんが、それらはそもそも目的ではありませんでした。「無圧縮(stored)」エントリ(方式 0、圧縮なし — ZIP の中に入れられた JPEG や MP4 などのすでに圧縮済みの中身によく使われます)は、救出がさらに簡単です。そのバイトは切り詰め地点までそのままコピーされるので、途中までしか届かなかった大きなファイルでも、何も得られないのではなく、使える先頭部分の断片が得られることがよくあります。

正直な限界:失われた末尾は戻らない

どんなツールも、ディスクに届かなかったバイトを返すことはできません。接続が 70% で切れたなら、圧縮データの最後の 30% はローカルには存在せず、何をもってしても — このページも、WinRAR の「修復(Repair)」も、有料の復元ソフトも — それを再構築することはできません。失われた末尾に対する唯一の本当の解決策は、元の場所から アーカイブをもう一度ダウンロードすることです。できれば HTTP レンジリクエスト(range requests)に対応したクライアントを使い、中断した転送が最初からやり直すのではなく、止まったところから再開できるようにするとよいでしょう。サーバーが ETagContent-Length を送っていたなら、その長さをあなたの部分ファイルのサイズと比べることで、実際にどれだけ欠けているかが正確にわかります。

いくつか正直な注意点があります。暗号化された ZIP(圧縮時にパスワードが設定されたもの、汎用ビット 0)は、パスワードなしでは走査できません。エントリのデータは暗号文で、たどるべき deflate 構造がないからです。ZIP64 形式で書かれた非常に大きなアーカイブは、独自の末尾構造 — ZIP64 EOCD レコード(PK\x06\x06)とそのロケータ(PK\x06\x07) — を持ちますが、これらは従来の EOCD とまったく同じように末尾とともに失われます。それでも前方走査は、形式にかかわらずローカルエントリを復元します。そして、最初のローカルヘッダーの断片しか届かなかったほど短いダウンロードには、たどるものが何もありません。この両極端の間にあるものは、すべて復元の対象になります。

処理のすべてがあなたのブラウザ内で行われるため、中身を覗くためだけにアーカイブがサーバーへコピーされることは決してありません — 「すべてダウンロード」のバンドルに税務書類、エクスポートしたチャット履歴、非公開のソースコードが入っているときに、これは重要です。ネットワークタブを開き、復元を実行して、ファイルから 0 バイトも自分のマシンを離れないことを確認できます。

修復できるものとできないもの

修復できる

  • ダウンロードが中断され、セントラルディレクトリと EOCD を失った ZIP — 切断より前に書き込まれたエントリは、先頭からローカルヘッダーを走査して復元されます
  • ストリーミング/サーバー生成の ZIP(ビットフラグのビット 3 が立ち、サイズは PK\x07\x08 データデスクリプタ内)で、deflate ストリームが BFINAL ビットで自己終端するもの
  • これまでに受信した完全なエントリを保持する、ブラウザの部分ダウンロードファイル(Chrome/Edge の .crdownload、Firefox の .part)
  • 切り詰め地点までそのままコピーされる「無圧縮(stored)」エントリ。切断をまたいだファイルの、使える先頭部分の断片も含みます
  • 末尾の EOCD 構造は失われたが、ローカルエントリは残っている ZIP64 アーカイブ

修復できない

  • 圧縮データが切り詰め地点より後にあったエントリ — それらのバイトはあなたのディスクにありません
  • 切断をまたいだ 1 つのファイル。部分的に戻るか、まったく戻らないことがあります
  • パスワードが提供されない、暗号化/パスワード保護された ZIP(エントリのデータは暗号文です)
  • 最初のローカルヘッダーの断片しか届かなかったほど短いダウンロード
  • データデスクリプタとセントラルディレクトリのレコードが失われた末尾にあったエントリについての、正確な CRC-32 と元のサイズ

修復が失敗した場合、その理由(データの欠落か構造の破損か)をお伝えします。失敗した修復に料金が請求されることはありません。

よくある質問

ダウンロード直後に ZIP が "unexpected end of archive" と表示するのはなぜですか?

最後のバイトが届く前にダウンロードが中断されたからです。ZIP はそのインデックス — セントラルディレクトリと End Of Central Directory レコード — をファイルのいちばん最後に置いており、切れた転送が失うのはまさにその末尾です。アーカイブの先の方に保存されたファイルはたいてい無傷ですが、それらが存在すると教えてくれる目次を展開ツールが見つけられないだけなのです。

全部をダウンロードし直さずにファイルを復元できますか?

たいていはできます — 中断より前に届き終わったすべてのファイルです。ツールは各ローカルファイルヘッダー(PK\x03\x04)を前方へ走査してエントリを展開するので、途中までしか届かなかったアーカイブでも完全なファイルは取り出せます。返せないのは、データが切断より後に来たファイルです。それらについては、やはりダウンロードし直す必要があります。

ブラウザが .crdownload や .part のファイルを残しました。これは復元できますか?

できることがあります。.crdownload(Chrome/Edge)や .part(Firefox)は、一時的な名前が付いた、部分的にダウンロードされたバイトにすぎません。そのままここにドロップする(またはコピーを .zip にリネームする)と、前方走査が含まれている完全なエントリをすべて取り出します。一度もダウンロードされなかったファイルは含まれません。

むしろ、もう一度ダウンロードすべきですか?

できるなら、そうしてください — 新しく完全にダウンロードし直すのが常にいちばんきれいな解決策で、HTTP レンジリクエストに対応したクライアントなら、最初からやり直すのではなく中断した転送を再開できることがよくあります。復元が役立つのは、元の場所がもうない、遅い、レート制限されている場合や、バンドル全体ではなく、すでに届いたファイルだけがあればよい場合です。

ZIP を復元すると、どこかにアップロードされますか?

いいえ。アーカイブはあなたのディスクから読み込まれ、ブラウザのタブ内で走査されます。リーダーは純粋な TypeScript で、何も送信されません。ネットワークタブを開いて 0 バイトも出ていかないことを確認できます — 「すべてダウンロード」のバンドルに、見知らぬサーバーには渡したくない書類が入っているときに便利です。

関連: ZIP アーカイブを修復する · "Unexpected end of archive"(ZIP/RAR/7z) · "Compressed folder is invalid" · アップロードゼロの主張を検証する