Perché 7-zip / WinRAR decomprimono i file in "temp" prima di spostarli a destinazione?


50

Perché 7-zip / WinRAR decomprimono i file in "temp" prima di spostarli nella loro destinazione?

Non vedo alcun vantaggio rispetto alla semplice decompressione diretta verso la destinazione. È davvero irritante, specialmente per file di grandi dimensioni (come lo è ora!).


Modificare:

Si prega di spiegare il motivo per cui non sono fatte a posto .


3
Se si specifica `` come cartella temporanea in WinRAR, dovrebbe essere estratto direttamente nella destinazione.

Risposte:


82

Come stai estraendo esattamente i file? Stai utilizzando la riga di comando o la GUI? Stai trascinando i file o selezionandoli e usando la funzione di estrazione? Stai usando il menu contestuale con estensione shell?

Se si immette una cartella di destinazione e quindi si seleziona la funzione di estrazione o si utilizza l'estensione della shell, non si estraggono prima in una cartella temporanea, si estraggono direttamente nella destinazione.

Se selezioni i file nell'interfaccia utente e li trascini nella cartella di destinazione, verranno estratti in una cartella temporanea.

Il motivo sta nel modo in cui è selezionata la destinazione. Se si inserisce la cartella di destinazione o si utilizza la voce di menu di scelta rapida, il programma sa esattamente dove deve essere estratto. Tuttavia, se si trascina semplicemente i file, quindi a causa di come funziona la funzione di trascinamento della selezione di OLE , il programma non sa dove si trova la cartella di destinazione. In altre parole, è Explorerche riceve la cartella di destinazione, non il programma di archiviazione. Di conseguenza, il programma non può sapere dove estrarli, quindi li estrae semplicemente nella cartella temporanea, quindi Explorer li sposta una volta fatto. Puoi vederlo chiaramente estraendo un file di grandi dimensioni usando entrambi i metodi. Quando lo trascini in una cartella, viene estratto, quindi viene visualizzata la finestra di dialogo di funzionamento dei file standard di Explorer che lo sposta nella cartella. Se si specifica la cartella e si fa clic su Estrai, viene estratto e non viene eseguita alcuna ulteriore elaborazione.

Sentiti libero di consultare il codice sorgente di 7-Zip per vedere come viene gestita la posizione di estrazione.


L'ho imparato nel modo più duro diversi anni fa quando volevo implementare il trascinamento della selezione in un programma che stavo scrivendo.


7
Assolutamente geniale - grazie per questo! Questo mi ha sbalordito per anni, ma non ho mai avuto il tempo di rintracciare il "cosa" e il perché ". I tempi strani che trovo la mia cartella C: temp riempita nel whazoo, mi trascino tra le opzioni di Winrar per trovare dove si trova deve essere impostato per estrarre prima una cartella temporanea su C: Ma ahimè, non la trovo. Non ho mai collegato la correlazione tra i due metodi e ora apprezzo vedere la luce :) Grazie!
Coldblackice,

2
Una cosa che non va qui è che Explorer non sposta il file ma lo copia . Il che è davvero irritante perché lo spostamento è molto veloce (tranne quando si sposta da una partizione all'altra) e avrebbe dovuto essere la scelta ideale (non spreca spazio), ma gli idioti di Microsoft hanno pensato che fosse un'ottima idea copiare dalla cartella temporanea quindi lascia semplicemente in giro i dati della cartella temporanea. Non solo l'estrazione di un enorme archivio richiederà il doppio dello spazio, ma richiederà anche il doppio del tempo!
ADTC

Probabilmente avevano una buona ragione per questo, e potrebbe essere stato a causa di un qualche tipo di limitazione dei sistemi e / o DDE su cui si basava, quando progettarono per la prima volta OLE, ai tempi di Windows 3; una limitazione che può o non può essere applicata oggi.
Synetech,

1
Sì, è ridicolo, specialmente su una macchina virtuale con spazio limitato. L'uso di "Estrai in" decomprime un archivio RAR da 8 GB con oltre 6000 file in circa 1 minuto. Tuttavia, se si trascinano le cartelle, è necessario lo stesso tempo per decomprimere in una directory temporanea, ma inoltre congela la finestra di destinazione e quindi COPIA i file per oltre 15 minuti a soli 3 MB / s. È particolarmente lento copiare un file sulla stessa unità (probabilmente a causa del file system virtuale sottostante), anche se posso copiare un file da un'altra macchina virtuale su questa macchina sulla rete a centinaia di MB / s.
Triynko,

1
Immagino che una potenziale soluzione sarebbe quella di creare un file a 0 byte con un nome GUID, cioè praticamente improbabile che si verifichi come un nome di file duplicato. Quindi monitorare gli handle di file di explorer.exe per vedere dove copia il file. Estrarre infine l'archivio nella destinazione.
Zv_oDD,

1

In questo modo i requisiti di memoria per la decompressione sono ridotti al minimo.

Se non usassero il filesystem, la decompressione si verificherebbe in memoria. In condizioni di memoria insufficiente, o per file compressi di grandi dimensioni questo prima o poi esaurirebbe la memoria disponibile e avvierebbe il processo di paging della memoria.

Il paging in queste circostanze sarebbe molto più lento del semplice utilizzo del filesystem perché il file è ancora in fase di decompressione (e i file di pagina continuano ad essere aggiunti), ma anche perché mentre il file viene decompresso, viene verificato la presenza di errori e c'è molte operazioni di lettura / scrittura. La cosa peggiore che può capitare a un file di paging.

EDIT: per quanto riguarda l'uso di una directory temporanea, è così per seguire molte linee guida del sistema operativo. Se la decompressione fallisce, non c'è garanzia che il programma che esegue l'operazione ripulisca dopo se stesso. Potrebbe essersi schiantato per esempio. Pertanto, nessun file residuo rimane nella directory di destinazione e il sistema operativo eliminerà il file temporaneo quando lo riterrà opportuno.


3
Sebbene sia vero, ciò non spiega perché i file vengano prima compressi in una directory temporanea e poi spostati in quella di destinazione. L'operazione potrebbe anche aver luogo proprio lì.
slhck,

3
Modificato per riflettere meglio la tua domanda
A Dwarf,

4
@ Dante, non è vero. Lo spostamento di un file sulla stessa partizione modifica semplicemente l'indice del file nel file system nella nuova directory, non copia alcun dato e richiede solo un istante. Non mi credi? Provalo, taglia un file multi-GB da una cartella e incollalo in un'altra cartella; ci vuole meno di un secondo. Provano la stessa cosa su un'altra unità o partizione. Ci vogliono minuti
Dour High Arch,

3
Ri "il sistema operativo eliminerà il file temporaneo quando lo riterrà opportuno": Windows lo fa mai ?
gravità

1
Questa risposta completamente falsa dovrebbe essere rimossa. 7zip si decomprime in una cartella temporanea solo durante le operazioni di trascinamento della selezione e ciò è dovuto alle limitazioni di Windows. Vedi superuser.com/questions/197961/… per maggiori informazioni.
dss539,

-1

Il motivo è più semplice di quanto si pensi: molti programmi scompattano i file in% temp%, è che il filesystem di destinazione potrebbe non avere abbastanza spazio.

Ora, potresti sapere che il tuo filesystem potrebbe avere abbastanza spazio, ma l'applicazione no. Cosa succede se quel file system è in uso dal sistema operativo o da un'altra applicazione e viene riempito durante la decompressione?

Gli sviluppatori ipotizzano che% temp% abbia spazio "illimitato", mentre la destinazione no.


Non proprio; non è un motivo per usare la directory temporanea. L'applicazione sa (o almeno può) sapere se c'è abbastanza spazio o meno. Innanzitutto, l'archiviatore sa esattamente quanto sono grandi i file compressi quando vengono decompressi e possono allocarli in anticipo, quindi riempirli mentre si decomprime e, in secondo luogo, è abbastanza semplice interrogare lo spazio libero su un'unità. Inoltre, se non c'è abbastanza spazio, allora si decomprime mentre può, quindi genera un errore quando esaurisce lo spazio.
Synetech,

In realtà, questa è piuttosto la risposta. Solo perché un'applicazione può preallocare lo spazio sulla destinazione di destinazione, ciò non significa che avrà accesso esclusivo ad esso. L'applicazione può interrogare la destinazione e vedere se ha abbastanza spazio, ma mentre quella query sta accadendo, prima che sia in grado di allocare spazio, un'altra applicazione può occupare parte di quello spazio.
Keltari,

Inoltre, uno spazio temporaneo degli utenti è legato a tale utente a livello di filesystem. Se si è verificato un arresto anomalo o un altro errore, un altro utente non ha potuto vedere i file temporanei. La destinazione potrebbe non avere tali restrizioni di sicurezza, quindi è più sicuro non avere dati sensibili sospesi su un altro file system.
Keltari,

Come ho detto, se si esaurisce durante la decompressione, fornisce semplicemente un messaggio di errore. In che modo l'estrazione su un'unità temporanea potrebbe risolverlo? Se non c'è abbastanza spazio, allora non c'è abbastanza spazio dopo che i file sono stati estratti nell'unità temporanea, e questo spreca tutti quei cicli della CPU e l'unità legge / scrive nell'estrazione nell'unità temporanea per niente. Come ho detto nella mia risposta, sentiti libero di consultare il codice sorgente di 7-Zip o contatta Alexander Roshal per chiedergli di WinRAR. Inoltre, come ho già detto, se si specifica l'obiettivo o si utilizza il menu di scelta rapida, non utilizza% temp%.
Synetech,

-2

Non essendo uno sviluppatore 7-zip o WinRAR, i miei commenti qui sono puramente speculazioni. Detto questo, usare lo spazio temporaneo per decomprimere fino a quando tutto è completo aiuta a verificare che tutti i file siano intatti (cioè che lo zip non sia danneggiato).

Non c'è niente di peggio che decomprimere un file compresso di grandi dimensioni, avendo iniziato a lavorare sui file all'inizio dell'archivio; solo per scoprire che qualcosa è danneggiato alla fine dell'archivio. A quel punto perdi la fiducia in tutto.

Il mio ultimo commento è che non ricordo di aver visto questo comportamento da 7-zip. Quando faccio clic con il pulsante destro del mouse e dico estrai qui, in genere ho accesso ai file mentre vengono decompressi. Hai ricontrollato che non è un'impostazione da qualche parte?


3o paragrafo: non riesco a trovare tali impostazioni, ed è un grande gruppo di file (4G) che stavo estraendo proprio ora, sono abbastanza sicuro che tutti i 4G siano stati spostati lentamente alla fine.

2o paragrafo: l'estratto in "temp" non impedisce nulla se il file zippato è già corrotto.

Ti impedisce di vedere i file da una zip danneggiata. La logica è che non puoi vedere nulla finché non viene verificato tutto. Per quanto riguarda l'impostazione, non sono sicuro di cosa dirti. Se dico a 7-zip di estrarre un file tar di grandi dimensioni sul mio desktop, comincio a vedere immediatamente i file. Potrebbe essere perché tar non è un formato compresso.
Kirk,

> La logica è che non puoi vedere nulla finché non viene verificato tutto. È assurdo. Come recupereresti alcuni file da un archivio corrotto? Il motivo per cui non lo si verifica è perché è stata utilizzata l'estensione della shell anziché trascinare i file dalla GUI.
Synetech,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.