ZIP di un download interrotto

Un download fermatosi troppo presto non stravolge uno ZIP — lo tronca. L'indice in coda al file (la directory centrale) non è mai arrivato, così gli estrattori rifiutano l'intero archivio anche se i file memorizzati prima sono ancora lì. Recuperare quei file è questione di leggere lo ZIP dall'inizio, e non richiede di consegnarlo a un server.

Il tuo file non lascia mai il tuo dispositivo — la riparazione avviene nel browser. 0 byte caricati.

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.

Ripara ora

  1. Trascina il file
  2. La riparazione avviene in locale
  3. Scarica il risultato

Quando un download del browser, uno "scarica tutto" dal cloud, o una copia su una connessione instabile si ferma prima dell'ultimo byte, il .zip che finisce sul tuo disco resta troncato — più corto di quanto il server intendesse. WinRAR e 7-Zip dicono "Unexpected end of archive", il comando unzip di Info-ZIP dice "End-of-central-directory signature not found", l'Esplora file di Windows dice "The Compressed (zipped) Folder is invalid", e il modulo zipfile di Python solleva BadZipFile: File is not a zip file. Tutti reagiscono alla stessa cosa: manca l'indice dell'archivio, che vive proprio alla fine. Trascina il file parziale qui sopra e lo strumento ignora l'indice assente e percorre le voci dall'inizio nel browser, estraendo ogni file scritto per intero prima dell'interruzione — non viene caricato nulla.

Perché un download interrotto rompe uno ZIP

Uno ZIP viene scritto dall'inizio alla fine, ma viene letto dalla fine all'inizio. Ogni file che hai aggiunto è memorizzato come voce di file locale — un'intestazione che inizia con la firma PK\x03\x04, che porta con sé il nome, il metodo di compressione (0 = memorizzato, 8 = deflate) e a seguire i byte compressi —, ma l'indice autorevole di dove vivono quelle voci è la directory centrale (record PK\x01\x02) scritta per ultima, subito prima del record End Of Central Directory da 22 byte, PK\x05\x06. Un estrattore apre il file posizionandosi alla fine e percorrendolo all'indietro in cerca di quella firma PK\x05\x06 — fino a circa 65.557 byte indietro, perché il record termina con un campo commento di lunghezza variabile. Solo dopo aver trovato l'EOCD sa quante voci contiene l'archivio e dove inizia ciascun record della directory centrale.

Ora immagina il download fermatosi al 70 %. I byte che non sono mai arrivati sono quelli scritti per ultimi: la directory centrale e l'EOCD. L'estrattore si posiziona alla fine, percorre all'indietro, non vede mai PK\x05\x06 e si arrende prima di toccare un solo file. È questa l'origine esatta del "End-of-central-directory signature not found" di unzip, dell'"Unexpected end of archive" di 7-Zip e WinRAR, del "The Compressed (zipped) Folder is invalid" dell'Esplora file, e dell'"Unable to expand … (Error 2)" dell'Utility Archivio di macOS. Nessuno di questi significa che i file memorizzati siano stravolti — significano che la tabella dei contenuti in coda è scomparsa.

I download interrotti sono particolarmente soggetti a questo per come vengono generati molti ZIP. Un archivio assemblato al volo da un server — uno "scarica tutto" da un'archiviazione cloud, lo ZIP gemello del tarball del codice sorgente di un repository GitHub, un pacchetto di esportazione — di solito viene inviato in streaming: il bit 3 dell'indicatore di uso generale (0x0008) è attivo, la dimensione compressa e il CRC-32 di ogni intestazione locale vengono lasciati a zero, e i valori reali vengono aggiunti dopo i dati della voce in un descrittore di dati (PK\x07\x08). Per quegli archivi la directory centrale è l'unico posto in cui le dimensioni sono garantite, così perdere la coda è doppiamente dannoso per un estrattore normale. Il file scritto a metà che il tuo browser si è lasciato dietro — un .crdownload di Chrome/Edge, un .part di Firefox, o un .zip semplicemente più corto del Content-Length della risposta — contiene comunque ogni voce completa fino all'interruzione e nulla di successivo.

Cosa recupera il percorso in avanti da uno ZIP parziale

Il recupero non ha affatto bisogno dell'indice mancante, perché in uno ZIP ogni voce locale si descrive da sé. Invece di posizionarsi alla fine, lo strumento percorre il file in avanti dall'offset 0, fermandosi a ogni intestazione locale PK\x03\x04 che trova, leggendo il nome del file e il metodo di compressione, e poi decomprimendo il flusso deflate che segue. Deflate si autotermina: un flusso è una sequenza di blocchi e il blocco finale porta un bit BFINAL impostato a 1, così il decoder può trovare dove finiscono i dati di una voce anche quando il campo dimensione dell'intestazione locale è stato lasciato a zero da uno scrittore in streaming. Quando il flusso termina in modo pulito, lo strumento registra un file recuperato, salta l'eventuale descrittore di dati PK\x07\x08 finale e continua fino alla successiva PK\x03\x04. Tutto questo gira come puro TypeScript nella tua scheda — senza binario unzip, senza trasmettere nulla.

Il risultato è che ogni file scritto per intero prima dell'interruzione torna, in ordine, con il nome e il percorso di cartella originali. Se il download è morto a metà del quarto di dieci file, ottieni i primi tre intatti e un quarto parziale o scartato; i sei che non sono mai arrivati non si possono evocare, ma non erano quello il punto. Una voce "memorizzata" (metodo 0, senza compressione — comune per contenuti già compressi come JPEG o MP4 inseriti dentro lo ZIP) è ancora più semplice da recuperare: i suoi byte vengono copiati tali e quali fino al punto di troncamento, così anche un file grande arrivato a metà dà spesso un frammento iniziale utilizzabile invece di niente.

Il limite onesto: la coda mancante è persa

Nessuno strumento può restituire byte che non sono mai arrivati sul tuo disco. Se la connessione è caduta al 70 %, l'ultimo 30 % dei dati compressi non esiste in locale, e niente — né questa pagina, né la "Riparazione" di WinRAR, né una suite di recupero a pagamento — può ricostruirlo. L'unica vera soluzione per la coda mancante è riscaricare l'archivio dalla sorgente, idealmente con un client che supporti le richieste di intervallo HTTP (range requests), così un trasferimento interrotto può riprendere da dove si è fermato invece di ripartire da capo. Se il server ha inviato un ETag o un Content-Length, confrontare quella lunghezza con la dimensione del tuo file parziale ti dice esattamente quanto manca davvero.

Qualche limite onesto. Uno ZIP cifrato (una password impostata al momento della compressione, bit 0 dell'indicatore di uso generale) non può essere percorso senza la password, perché i dati della voce sono testo cifrato senza struttura deflate da seguire. Un archivio molto grande scritto in formato ZIP64 mantiene proprie strutture finali — il record EOCD di ZIP64 (PK\x06\x06) e il suo localizzatore (PK\x06\x07) — che si perdono con la coda esattamente come l'EOCD classico, ma il percorso in avanti recupera comunque le voci locali qualunque sia il formato. E un download così corto da aver ricevuto solo un frammento della primissima intestazione locale non ha nulla da percorrere. Tutto ciò che sta tra questi due estremi è recuperabile.

Poiché l'intera operazione avviene nel tuo browser, l'archivio non viene mai copiato su un server solo per guardarci dentro — cosa che conta quando un pacchetto "scarica tutto" contiene documenti fiscali, cronologie di chat esportate o codice sorgente privato. Puoi aprire la scheda Rete, eseguire il recupero e confermare che non esce nemmeno un byte del file dalla tua macchina.

Cosa può e cosa non può riparare

Può riparare

  • Uno ZIP il cui download si è interrotto, perdendo la directory centrale e l'EOCD — le voci scritte prima dell'interruzione vengono recuperate percorrendo le intestazioni locali dall'inizio
  • ZIP in streaming / generati dal server (bit 3 dell'indicatore attivo, dimensioni in un descrittore di dati PK\x07\x08) i cui flussi deflate si autoterminano con il bit BFINAL
  • File di download parziale del browser (.crdownload di Chrome/Edge, .part di Firefox) che contengono le voci complete ricevute finora
  • Voci "memorizzate" (non compresse) copiate tali e quali fino al punto di troncamento, incluso un frammento iniziale utilizzabile del file rimasto a cavallo dell'interruzione
  • Archivi ZIP64 le cui strutture EOCD finali sono andate perse ma le cui voci locali sopravvivono

Non può riparare

  • Qualsiasi voce i cui dati compressi si trovavano dopo il punto di troncamento — quei byte non sono sul tuo disco
  • L'unico file rimasto a cavallo dell'interruzione, che può tornare parziale o non tornare affatto
  • ZIP cifrati / protetti da password quando la password non viene fornita (i dati della voce sono testo cifrato)
  • Un download così corto che è arrivato solo un frammento della prima intestazione locale
  • Il CRC-32 e le dimensioni originali esatti delle voci il cui descrittore di dati e i cui record della directory centrale erano nella coda mancante

Se una riparazione fallisce, ti diciamo perché (dati mancanti rispetto a struttura danneggiata), e non ti viene mai addebitato nulla per una riparazione fallita.

Domande frequenti

Perché il mio ZIP dice "unexpected end of archive" subito dopo averlo scaricato?

Perché il download si è interrotto prima che arrivassero gli ultimi byte. Uno ZIP tiene il suo indice — la directory centrale e il record End Of Central Directory — proprio alla fine del file, e quella coda è esattamente ciò che perde un trasferimento tagliato a metà. I file memorizzati prima nell'archivio di solito sono intatti; l'estrattore semplicemente non riesce a trovare la tabella dei contenuti che gli dice che esistono.

Posso recuperare i file senza riscaricare tutto?

Spesso sì — ogni file che ha finito di arrivare prima dell'interruzione. Lo strumento percorre in avanti in cerca di ogni intestazione di file locale (PK\x03\x04) e decomprime la voce, così un archivio arrivato a metà restituisce comunque i suoi file completi. Ciò che non può restituire è qualsiasi file i cui dati sono arrivati dopo l'interruzione; per quelli devi scaricare di nuovo.

Il mio browser ha lasciato un file .crdownload o .part. È recuperabile?

Può esserlo. Un .crdownload (Chrome/Edge) o un .part (Firefox) non è altro che i byte scaricati parzialmente sotto un nome temporaneo. Trascinalo qui così com'è (oppure rinomina una copia in .zip) e il percorso in avanti estrae le voci complete che contiene. Non conterrà file che non sono mai stati scaricati.

Non dovrei semplicemente riscaricarlo?

Se puoi, sì — un download nuovo e completo è sempre la soluzione più pulita, e un client che supporti le richieste di intervallo HTTP (range requests) può spesso riprendere il trasferimento interrotto invece di ricominciare da zero. Il recupero serve per quando la sorgente non c'è più, è lenta o limitata dal rate limiting, o quando ti servono solo i file già arrivati invece dell'intero pacchetto.

Recuperare lo ZIP lo carica da qualche parte?

No. L'archivio viene letto dal tuo disco e percorso nella scheda del tuo browser; il lettore è puro TypeScript e non viene trasmesso nulla. Puoi aprire la scheda Rete e confermare che non esce nemmeno un byte — utile quando un pacchetto "scarica tutto" contiene documenti che preferiresti non consegnare al server di uno sconosciuto.

Correlati: Ripara un archivio ZIP · "Unexpected end of archive" (ZIP/RAR/7z) · "Compressed folder is invalid" · Verifica la promessa di zero upload