web-dev-qa-db-fra.com

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

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

Ces programmes écrivent d'abord dans le dossier temporaire, puis le copient vers la destination prévue.

Exemple: 7Zip extrait d'abord dans le dossier temporaire, puis copie les données extraites à l'emplacement où vous lui aviez demandé d'extraire les données.

Je vois plusieurs problèmes avec cette approche:

  1. Le dossier temporaire peut ne pas avoir suffisamment d'espace, tandis que l'emplacement prévu peut avoir autant d'espace.

  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 pas un seul point positif à faire cela. Suis-je en train de manquer quelque chose ou y a-t-il un réel avantage à le faire?

49
Devdatta Tengshe

Quelques raisons auxquelles je peux penser:

  • Sur la plupart des plates-formes, les déplacements de fichiers sont atomiques, mais les écritures de fichiers ne le sont pas (surtout si vous ne pouvez pas écrire toutes les données en une seule fois). Donc, si vous avez le modèle de producteur/consommateur typique (un processus produit des fichiers, l'autre surveille un répertoire et récupère tout ce qu'il trouve), écrire d'abord dans un dossier temporaire et ensuite se déplacer vers l'emplacement réel signifie que le consommateur ne peut jamais voir un fichier inachevé.
  • Si le processus qui écrit le fichier s'arrête à mi-chemin, vous avez un fichier cassé sur votre disque. S'il se trouve dans un emplacement réel, vous devez vous occuper de le nettoyer vous-même, mais s'il se trouve dans 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, le travail peut récupérer un fichier incomplet; Les répertoires temporaires sont généralement exclus des sauvegardes, de sorte que 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 volatile (par exemple un disque virtuel), ce qui peut être bénéfique pour des choses comme le téléchargement de plusieurs morceaux du même fichier en parallèle ou le traitement sur place du fichier avec de nombreuses recherches. En outre, les répertoires temporaires ont tendance à provoquer 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 distincte peut aider à limiter la fragmentation des autres partitions.

TL; DR - cela se résume principalement à l'atomicité, c'est-à-dire que vous voulez faire en sorte que (à l'emplacement final) le fichier soit complet ou pas là du tout à un moment donné.

96
tdammers

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 remplace ce comportement de glisser-déposer et permet de déposer le fichier dans le bon dossier immédiatement. Ils expliquent l'astuce dans leur documentation et, plus intéressant, quel est le problème et comment ils l'ont résolu.

Voici la partie intéressante:

La mécanique de glisser-déposer de Windows ne permet pas à l'application source de l'opération de glisser-déposer de savoir facilement où les fichiers sont déposés. C'est à l'application cible (Windows Explorer en général) 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. Gardez à l'esprit que vous pouvez déposer des fichiers non seulement dans un répertoire, mais même dans un fichier Zip (ou toute autre archive), un répertoire distant (via FTP, SFTP, SCP,…), une corbeille,…

De toute évidence, même l'Explorateur Windows (ou toute autre application cible, comme WinZip) ne peut pas télécharger de fichiers à partir d'une source possible (en particulier, il ne connaît pas SFTP/SCP).

En outre, spécifiquement pour 7Zip: l'utilisateur ray023 répond à cette question dans le SuperUser Stack Q&A: https://superuser.com/a/42246

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

15
Jalayn

Si vous devez effectuer tout type de traitement de données dans le fichier (décoder/convertir/etc.), il est préférable d'utiliser un fichier temporaire et une fois terminé, et seulement s'il est terminé, de transférer le résultat vers la destination finale.

Avantages:

  1. Seuls les fichiers terminés atteignent la destination
  2. Le fichier temporaire peut (doit) résider sur un support rapide
  3. Évitez la fragmentation du 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 de réels avantages d'écrire directement vers la destination lors du traitement des données.

0
roetnig