Pourquoi 7-zip / WinRAR décompresse-t-il les fichiers avant de les déplacer vers leur destination?

50

Pourquoi 7-zip / WinRAR décompresse-t-il les fichiers en fichiers "temporaires" avant de les déplacer vers leur destination?

Je ne vois aucun avantage par rapport à la décompression directe vers la destination. C'est vraiment irritant, surtout pour les gros fichiers (comme maintenant!).


Modifier:

S'il vous plaît expliquer pourquoi ils ne sont pas faits en place .

Stevoisiak
la source
3
Si vous spécifiez `` comme dossier temporaire dans WinRAR, il doit être extrait directement vers la destination.

Réponses:

82

Comment extrayez-vous exactement les fichiers? Utilisez-vous la ligne de commande ou l'interface graphique? Faites-vous glisser les fichiers ou les sélectionnez-vous et utilisez-vous la fonction d'extraction? Utilisez-vous le menu contextuel de l'extension shell?

Si vous entrez un dossier de destination, puis sélectionnez la fonction d'extraction ou utilisez l'extension shell, ils ne sont pas d'abord extraits dans un dossier temporaire, ils sont extraits directement vers la destination.

Si vous sélectionnez les fichiers dans l'interface utilisateur et que vous les faites glisser dans le dossier cible, il sera extrait dans un dossier temporaire.

La raison en est la façon dont la destination est sélectionnée. Si vous entrez dans le dossier cible ou utilisez l'élément de menu contextuel, le programme sait exactement où il doit extraire. Toutefois, si vous ne faites que faire glisser les fichiers, le programme ne sait pas où se trouve le dossier cible en raison du fonctionnement de la fonction glisser-déposer de OLE . En d'autres termes, c'est Explorerqui reçoit le dossier cible, pas le programme d’archivage. En conséquence, le programme ne peut pas savoir où les extraire, il les extrait donc simplement dans le dossier temporaire, puis Explorer les déplace une fois que c'est fait. Vous pouvez le voir clairement en extrayant un gros fichier en utilisant les deux méthodes. Lorsque vous le faites glisser dans un dossier, il est extrait, puis vous voyez la boîte de dialogue des opérations de fichier standard d'Explorer le déplacer dans le dossier. Si vous spécifiez le dossier et cliquez sur Extraire, il est extrait et aucun traitement supplémentaire n'est effectué.

N'hésitez pas à parcourir le code source de 7-Zip pour voir comment l’emplacement d’extraction est géré.


J'ai appris cela à la dure, il y a plusieurs années, lorsque je voulais implémenter le glisser-déposer dans un programme que j'écrivais.

Synetech
la source
7
Absolument génial - merci pour cela! Cela me stupéfie depuis des années, mais je n'ai jamais pris le temps de rechercher le "quoi" et pourquoi ". Les fois où je trouve mon dossier C: temp saturé, je parcours les options de Winrar pour trouver où il se trouve. doit être réglé pour extraire d'abord dans un dossier temporaire sur C:. Mais hélas, je ne le trouve pas. Je n'ai jamais connecté la corrélation entre les deux méthodes, et j'apprécie maintenant de voir la lumière :) Merci!
Coldblackice
2
Une des choses qui ne va pas, c’est que l’explorateur ne déplace pas le fichier mais le copie . Ce qui est vraiment irritant, car le déplacement est très rapide (sauf lors du déplacement de partition en partition) et aurait dû être le choix idéal (cela ne gaspille pas d'espace), mais les idiots de Microsoft ont pensé que c'était une bonne idée de copier à partir du dossier temporaire. puis laissez simplement les données du dossier temporaire traîner. Non seulement l'extraction d'une énorme archive va prendre le double de l'espace disponible, mais elle va prendre presque le double de temps!
ADTC
Ils avaient probablement une bonne raison à cela, et ce peut-être à cause d'une sorte de limitation des systèmes et / ou du DDE sur lequel il était basé, quand ils ont conçu OLE pour la première fois, à l'époque de Windows 3; une limitation qui peut ou peut ne pas s'appliquer aujourd'hui.
Synetech
1
Ouais, c'est ridicule, surtout sur une machine virtuelle avec un espace limité. Utiliser "extraire" décompresse une archive RAR de 8 Go avec plus de 6000 fichiers en environ 1 minute. Toutefois, si vous faites glisser les dossiers vers l'extérieur, la décompression dans un répertoire temporaire prend le même temps, mais elle bloque en outre la fenêtre cible, puis COPIE les fichiers pendant plus de 15 minutes à seulement 3 Mo / s. Il est particulièrement lent de copier un fichier sur le même lecteur (probablement en raison du système de fichiers virtuel sous-jacent), même si je peux copier un fichier depuis une autre machine virtuelle sur cette machine via le réseau à des centaines de Mo / s.
Triynko
1
J'imagine qu'une solution possible consisterait à créer un fichier de 0 octet avec un nom GUID, c'est-à-dire qu'il est pratiquement improbable que le nom de fichier soit dupliqué. Ensuite, surveillez les descripteurs de fichier de explorer.exe pour voir où il copie le fichier. Enfin extraire l'archive à la destination.
Zv_oDD
1

C'est fait pour que les besoins en mémoire pour la décompression soient réduits au minimum.

S'ils n'utilisaient pas le système de fichiers, la décompression se produirait en mémoire. Dans des conditions de mémoire insuffisante ou pour des fichiers compressés volumineux, cela épuiserait tôt ou tard la mémoire disponible et lancerait le processus de pagination de la mémoire.

La pagination dans ces circonstances serait beaucoup plus lente que d'utiliser simplement le système de fichiers car le fichier est toujours en cours de décompression (et les fichiers de page continuent d'être ajoutés), mais également parce que le fichier est en cours de décompression, il est en train de vérifier les erreurs et ainsi de suite. beaucoup d'opérations de lecture / écriture. La pire chose qui puisse arriver à un fichier de page.

EDIT: En ce qui concerne l’utilisation d’un répertoire temporaire, il convient de suivre les directives de nombreux systèmes d’exploitation. Si la décompression échoue, rien ne garantit que le programme effectuant l'opération nettoie après lui-même. Il peut avoir planté par exemple. En tant que tel, il ne reste aucun fichier résiduel dans votre répertoire cible et le système d'exploitation supprimera le fichier temporaire s'il le juge approprié.

Un nain
la source
3
Bien que vrai, cela n'explique pas pourquoi les fichiers sont d'abord compressés dans un répertoire temporaire, puis déplacés vers le répertoire de destination. L'opération pourrait également se dérouler sur place.
Slhck
3
Modifié pour mieux refléter votre question
Un nain Le
4
@ Dante, ce n'est pas vrai. Déplacer un fichier sur la même partition modifie simplement l'index du fichier dans le système de fichiers vers le nouveau répertoire, il ne copie aucune donnée et ne prend qu'un instant. Ne me crois pas? Essayez-le, coupez un fichier de plusieurs Go dans un dossier et collez-le dans un autre dossier; cela prend moins d'une seconde. Ils essaient la même chose sur un autre lecteur ou une autre partition. Prend des minutes.
Haute arche de Dour
3
Re "le système d’exploitation supprimera le fichier temporaire s’il le juge approprié": Windows ne le fait-il jamais ?
Grawity
1
Cette réponse complètement fausse devrait être supprimée. 7zip ne décompresse que dans un dossier temporaire lors d'opérations de glisser-déposer, ce qui est dû aux limitations de Windows. Voir superuser.com/questions/197961/… pour plus d'informations.
dss539
-1

La raison est plus simple que vous ne le pensez: de nombreux programmes décompactent les fichiers à% temp%, c'est que le système de fichiers de destination n'a peut-être pas assez d'espace disque.

Vous savez peut- être que votre système de fichiers dispose peut-être de suffisamment d'espace, mais pas l'application. Que se passe-t-il si ce système de fichiers est utilisé par le système d'exploitation ou une autre application et se remplit lors de la décompression?

Les développeurs partent du principe que% temp% dispose d'un espace "illimité", contrairement à votre destination.

Keltari
la source
Pas assez; ce n'est pas une raison pour utiliser le répertoire temporaire. L'application sait (ou du moins peut) savoir s'il y a suffisamment d'espace ou non. En premier lieu, l’archiveur sait exactement quelle est la taille des fichiers compressés lorsqu’ils sont décompressés et peut les affecter au préalable, puis les renseigne au fur et à mesure de la décompression, et deuxièmement, il est assez simple d’interroger l’espace libre sur un lecteur. En outre, s’il n’ya pas assez d’espace, il se décompresse alors qu’il le peut, puis génère une erreur s’il manque d’espace.
Synetech
En fait, c'est tout à fait la réponse. Le fait qu’une application puisse préallouer l’espace sur la destination cible ne signifie pas qu’elle y aura un accès exclusif. L'application peut interroger la destination et voir si elle dispose de suffisamment d'espace, mais pendant que cette requête est en cours, avant de pouvoir allouer de l'espace, une autre application peut utiliser une partie de cet espace.
Keltari
En plus de cela, un espace temporaire d'utilisateurs est lié à cet utilisateur au niveau du système de fichiers. S'il y avait un crash ou un autre échec, un autre utilisateur ne pourrait pas voir les fichiers temporaires. La destination peut ne pas avoir de telles restrictions de sécurité, il est donc plus sûr de ne pas laisser de données potentiellement sensibles traîner sur un autre système de fichiers.
Keltari
Comme je l'ai dit, si le texte est épuisé lors de la décompression, cela donne simplement un message d'erreur. Comment l'extraction sur un lecteur temporaire le résoudrait-elle? Si l'espace disponible est insuffisant, l'espace disponible une fois les fichiers extraits sur le lecteur temporaire est gaspillé, ce qui gaspille tous ces cycles de processeur et ces lectures / écritures d'extraction sur le lecteur temporaire. Comme je l'ai dit dans ma réponse, n'hésitez pas à consulter le code source de 7-Zip ou à contacter Alexander Roshal pour lui poser des questions sur WinRAR. En outre, comme je l'ai dit aussi, si vous spécifiez la cible ou utilisez le menu contextuel, il n'utilise pas % temp%.
Synetech
-2

N'étant pas un développeur 7-zip ou WinRAR, mes commentaires ici sont purement spéculatifs. Cela dit, utiliser l’espace temporaire pour décompresser jusqu’à ce que tout soit terminé permet de vérifier que tous les fichiers sont intacts (c’est-à-dire que le zip n'est pas corrompu).

Il n’ya rien de pire que de décompresser un fichier compressé volumineux, ayant commencé à travailler sur des fichiers au début de l’archive; seulement pour découvrir que quelque chose est corrompu à la fin de l'archive. À ce stade, vous perdez confiance en tout.

Mon dernier commentaire est que je ne me souviens pas avoir vu ce comportement de 7-zip. Lorsque je clique avec le bouton droit de la souris et que je dis extraire ici, j'ai généralement accès aux fichiers au fur et à mesure qu'ils sont décompressés. Avez-vous vérifié que ce n'est pas un réglage quelque part?

Église
la source
3ème paragraphe: Je n'arrive pas à trouver de tels paramètres, et il s'agit d'un grand nombre de fichiers (4G) que je venais d'extraire, je suis presque sûr que toute la 4G a finalement été déplacée lentement.
2ème paragraphe: extraire vers "temp" n'empêche rien si le fichier compressé est déjà corrompu.
Cela vous empêche de voir des fichiers à partir d'un zip corrompu. La logique est que vous ne pouvez rien voir tant que tout n’est pas vérifié. En ce qui concerne le réglage, je ne sais pas quoi vous dire. Si je dis à 7-zip d'extraire un gros fichier tar sur mon bureau, je commence à voir les fichiers immédiatement. C'est peut-être parce que tar n'est pas un format compressé.
Kirk
> La logique est que vous ne pouvez rien voir tant que tout n’est pas vérifié. C'est absurde. Comment pouvez-vous alors récupérer des fichiers d'une archive corrompue? La raison pour laquelle vous n'en faites pas l'expérience est que vous avez utilisé l'extension shell au lieu de faire glisser les fichiers depuis l'interface graphique.
Synetech