2008-12-24 5 views
8

J'ai une situation très commune. J'ai un fichier, et j'ai besoin d'écraser entièrement ce fichier avec de nouveaux contenus. Toutefois, le fichier d'origine est accessible à chaque chargement de page (il s'agit d'une application Web), il ne peut donc pas être manquant très longtemps. Quelques ms est OK (mais pas idéal), une seconde n'est pas OK.Quelle est la meilleure façon de remplacer un fichier atomique multi-plateforme en Perl?

Pour l'instant, je le fais en écrivant un fichier temporaire dans le même répertoire, puis en renommant ce fichier temporaire au nom du nouveau fichier. J'utilise juste le File :: Temp normal et "rename" pour faire ceci, en Perl. Je me demandais - est-il une autre façon recommandée/meilleure de faire cela? De préférence, celui qui ne nécessite pas de module CPAN, car c'est le seul endroit de mon système où j'ai besoin de faire cela, et je ne veux pas de toute nouvelle dépendance juste pour ça. Oh, et tout cela doit fonctionner sous Windows, Linux, BSD, OS X, Solaris et la plupart des autres plates-formes communes.

Here is the code in question, pour les personnes intéressées.

Répondre

10

Votre méthode semble très bien. C'est rapide, c'est atomique, il n'utilise que des modules de base, et File :: Temp est un moyen sûr de traiter les fichiers temporaires. De quoi d'autre avez-vous besoin?

+0

Eh bien, peut-être juste une confirmation que c'est vraiment le meilleur moyen. :-) Je me demandais surtout s'il y avait une autre façon de le faire, puisque je regardais le code en question (pour corriger un bug) et je me suis dit que ce serait un bon moment pour l'améliorer si nécessaire . :-) –

+0

L'opération de déplacement est atomique, c'est donc une bonne façon de procéder. – Danny

6

Je le ferais de la même manière que vous le faites. Au moins sur les systèmes d'exploitation de type Unix, un renommage de fichier est garanti être atomique, donc vous n'aurez pas d'instants où l'original ou les nouveaux fichiers ne sont pas là.

0

Renommer est suffisant. Cependant:

Votre dossier temporaire est-il à risque de conditions de course? Le nom de fichier doit être aléatoire afin que personne ne puisse causer de problèmes en insérant son propre fichier. Utilisez une interface pour mkstemp() si possible.

+2

Je suis assez sûr que le fichier: Temp est correctement randomisé. –

+0

Ouais, File :: Temp est correctement randomisé, c'est à cela que sert le XXXXX dans le code. –

+1

File :: Temp est l'équivalent Perl de mkstemp & friends, et a été écrit en pensant à la sécurité. – ysth

Questions connexes