Quel est l’avantage d’écrire dans un emplacement temporaire, puis de le copier vers la destination voulue?


48

J'écris une application qui fonctionne avec des images satellites et mon patron m'a demandé d'examiner certaines applications commerciales et de voir comment elles se comportaient. J'ai constaté un comportement étrange et, comme je le recherchais, je l'ai également trouvé dans d'autres applications standard.

Ces programmes écrivent d’abord dans le dossier temporaire, puis copient-le dans la destination voulue.

Exemple: 7zip commence par extraire dans le dossier temporaire, puis copie les données extraites à l'emplacement où vous lui avez demandé d'extraire les données.

Je vois plusieurs problèmes avec cette approche:

  1. Le dossier temporaire ne dispose peut-être pas de suffisamment d'espace, tandis que l'emplacement prévu peut en contenir autant.

  2. S'il s'agit d'un fichier volumineux, l'opération de copie peut prendre un temps non négligeable.

J'y ai beaucoup réfléchi, mais je ne voyais aucun avantage positif à le faire. Est-ce que je manque quelque chose ou y a-t-il un réel avantage à le faire?


Si l'application l'exige, faites-le. Sinon, faites ce qui a du sens. Votre cerveau vous dit que ce n'est pas nécessaire dans ce cas. Je suis dans le camp de faire le moins de travail possible comme vous pouvez le constater par ma réponse, donc je vous recommande de faire le moins de travail possible pour l'application.
Jason Sebring

1
Etes-vous sûr qu'il "copie" le fichier et ne le "déplace pas"? Grande différence.
frankc

Depuis blogs.rsa.com/… , pour les malwares, l’avantage est 1) Une écriture garantie évite la détection des "erreurs rouges" avant même que le virus ne soit entièrement téléchargé sur l’ordinateur de l’utilisateur. 2) Les disques TEMP sont généralement plus rapides (RAMDisk), ce qui réduit le temps de Détection pendant que le virus est encore en phase de téléchargement (une fois que le virus est complètement formé et que son exécution est
exécutée

3) Pendant le téléchargement ou l'exécution, si un antivirus vous écrase (sans le savoir, parfois) et laisse vos os traîner, vous pouvez toujours compter sur x% de chances que le système d'exploitation ou l'utilisateur vous aide accidentellement à supprimer. vos os morts, même s'ils effacent en masse le dossier TEMP, cela permet de réduire la probabilité de détection.
Pacerier

Réponses:


96

Quelques raisons auxquelles je peux penser:

  • Sur la plupart des plates-formes, les déplacements de fichiers sont atomiques, mais pas les écritures de fichiers (surtout si vous ne pouvez pas écrire toutes les données en une fois). Donc, si vous avez le modèle producteur / consommateur typique (un processus produit des fichiers, l’autre surveille un répertoire et récupère tout ce qu’il trouve), écrire dans un dossier temporaire d’abord et ensuite seulement se déplacer à l’emplacement réel signifie que le consommateur ne peut jamais voir un répertoire. fichier inachevé.
  • Si le processus qui écrit le fichier tombe à mi-chemin, vous avez un fichier endommagé sur votre disque. S'il s'agit d'un emplacement réel, vous devez le nettoyer vous-même, mais s'il s'agit d'un emplacement temporaire, le système d'exploitation s'en chargera.
  • Si le fichier est créé lors de l'exécution d'un travail de sauvegarde, celui-ci peut récupérer un fichier incomplet. Les répertoires temporaires étant généralement exclus des sauvegardes, le fichier ne sera inclus qu'une fois déplacé vers la destination finale.
  • Le répertoire temporaire peut se trouver sur un système de fichiers rapide mais volatil (par exemple, un disque virtuel), ce qui peut être bénéfique, par exemple pour télécharger plusieurs morceaux du même fichier en parallèle ou pour effectuer un traitement sur place avec beaucoup de recherches. De plus, les répertoires temporaires ont tendance à causer plus de fragmentation que les répertoires avec des lectures, écritures et suppressions moins fréquentes, et le fait de conserver le répertoire temporaire sur une partition séparée peut aider à limiter la fragmentation des autres partitions.

TL; DR - cela revient essentiellement à l’attricité, c’est-à-dire que vous voulez faire en sorte que (à l’emplacement final) le fichier soit complet ou absent du tout à un moment donné.


12
Si le répertoire temporaire est sur une partition séparée, vous perdez l'atomicité.
yfeldblum

16
Certains programmes extrairont / copieront dans le répertoire prévu, mais ils utiliseront une extension de fichier temporaire (par exemple .tmp) et le renommeront une fois l’opération terminée.
Dan Diplo

5
Parfois, écrire dans un fichier temporaire est également utile lorsque plusieurs instances de votre programme peuvent essayer de télécharger le même fichier en même temps et que vous ne pouvez pas compter sur le système de fichiers pour fournir le bon niveau de verrouillage (comme une API de stockage dans le cloud mal définie). . L'utilisation du fichier temporaire garantira que le fichier résultant ne se retrouvera pas avec un mélange de données provenant des deux téléchargements. Bien sûr, il ne s'agit que d'un autre exemple d'atomicité.
Krzysztof Kozielczyk Le

1
Le cas de Dan Diplo est utile lors de la mise à jour d'un fichier existant. Vous ne voulez pas remplacer l'ancien jusqu'à ce que le nouveau soit écrit avec succès, de peur que l'écriture du nouveau échoue ou que quelque chose d'autre ne lise le nouveau avant qu'il ne soit complètement écrit.
RalphChapin

1
Malheureusement, les dossiers OS Temp sont remplis d'anciens fichiers et dossiers car le système d'exploitation ne le nettoie pas! En tant que développeurs, nous devrions donc tout nettoyer! superuser.com/questions/296824/…
markmnl

15

Cela semble être un problème dans Windows, plus spécifiquement lié à la gestion du glisser-déposer.

Les développeurs du client WINSCP ont développé leur propre extension shell, qui annule ce comportement de glisser-déposer et permet de déposer immédiatement le fichier dans le bon dossier. Ils expliquent le tour de force dans leur documentation et, plus intéressant encore, quel est le problème et comment ils l'ont résolu.

Voici la partie intéressante:

Le mécanisme de glisser-déposer de Windows ne permet pas à l'application source d'effectuer une opération de glisser-déposer pour savoir facilement où les fichiers sont déposés. C’est à l’application cible (généralement Windows Explorer) de transférer les fichiers vers la destination. C'est plutôt raisonnable, car l'application source peut difficilement transférer des fichiers vers toutes les destinations possibles. N'oubliez pas que vous pouvez déposer des fichiers non seulement dans un répertoire, mais également dans un fichier ZIP (ou toute autre archive), un répertoire distant (via FTP, SFTP, SCP,…), une corbeille,…

Bien entendu, même l’Explorateur Windows (ou toute autre application cible, telle que WinZip) ne peut pas télécharger de fichiers de toutes les sources possibles (en particulier, il ne connaît pas SFTP / SCP).

De plus, spécifiquement pour 7Zip: l'utilisateur ray023 répond à cette question dans le Q & A de la pile de superutilisateurs: https://superuser.com/a/422463

Fondamentalement, si au lieu de glisser-déposer votre fichier, vous utilisez la méthode "extraire ici" disponible dans 7-ZIP et Winrar, les fichiers sont directement extraits vers le bon répertoire.


2
La question n'était pas "Pourquoi 7zip utilise-t-il des fichiers temporaires?" La vraie question était "Pourquoi les fichiers temporaires sont-ils couramment utilisés dans le développement de logiciels?"
Phil

@Phil L'exemple donné est, d'après ce que j'ai compris, ce qui se passe lorsque vous faites glisser un fichier d'une archive dans un dossier du système, sans demander explicitement de "l'extraire". Pourtant, j'ai relu la question, et oui, je pense que vous avez raison de dire que l'auteur voulait en savoir plus sur l'utilité des dossiers temporaires, ce qui a d'ailleurs été une réponse magistrale de la part de tdammers (+1 voté par moi aussi)
Jalayn

Bien que votre réponse ne corresponde pas exactement à ce que je recherchais, +1, pour résoudre mon problème avec 7zip
Devdatta Tengshe, le

1
Un bon commentaire revient essentiellement à: pourquoi un programme utilise-t-il un dossier temporaire? Parce que lorsque vous faites un glisser-déposer, il ne connaît pas le dossier de destination et se contente de le "donner" à Windows, puis Windows prend le relais et met le fichier au bon endroit.
Pieter B

0

Si vous devez effectuer n'importe quel type de traitement de données dans le fichier (décoder / convertir / etc.), il est préférable d'utiliser un fichier temporaire. Une fois terminé, transférez le résultat à la destination finale uniquement.

Avantages:

  1. Seuls les fichiers terminés atteignent la destination
  2. Le fichier temporaire peut (devrait) résider dans un support rapide
  3. Eviter la fragmentation sur le fichier final
  4. Permet l'utilisation d'autres médias comme destination finale (ftp, cloud, peu importe)
  5. Les fichiers temporaires abandonnés sont plus faciles à nettoyer

Je ne vois pas les avantages réels d’écrire directement à la destination lors du traitement des données.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.