Was ist der beste Weg für eine plattformübergreifende, atomare Dateiersetzung in Perl?

8

Ich habe eine sehr häufige Situation. Ich habe eine Datei, und ich muss diese Datei vollständig mit neuen Inhalten überschreiben. Auf die Originaldatei wird jedoch bei jedem Laden der Seite zugegriffen (dies ist eine Web-App), daher kann sie nicht sehr lange fehlen. Ein paar ms ist OK (obwohl nicht ideal), eine Sekunde ist nicht OK.

Im Moment mache ich das, indem ich eine temporäre Datei in dasselbe Verzeichnis schreibe und dann diese temporäre Datei in den Namen der neuen Datei umbenenne. Ich verwende nur die normale Datei :: Temp und "Umbenennen", um dies in Perl zu tun. Ich habe mich gefragt - gibt es einen anderen empfohlenen / besseren Weg, dies zu tun? Vorzugsweise eines, das kein CPAN-Modul benötigt, da dies die einzige Stelle in meinem System ist, die ich dazu brauche, und ich möchte keine ganz neue Abhängigkeit nur dafür haben.

Oh, und all das muss unter Windows, Linux, BSD, OS X, Solaris und den meisten anderen gängigen Plattformen funktionieren.

Hier ist der betreffende Code für Interessierte.

    
Max Kanat-Alexander 24.12.2008, 18:44
quelle

3 Antworten

10

Ihre Methode scheint gut zu sein. Es ist schnell, es ist atomar, es verwendet nur Kernmodule und File :: Temp ist eine sichere Methode, um mit temporären Dateien umzugehen. Was brauchen Sie mehr?

    
Adam Bellaire 24.12.2008, 18:53
quelle
6

Ich würde es genauso machen wie du es tust. Zumindest auf Unix-Betriebssystemen ist eine Dateiumbenennung garantiert atomar, so dass Sie keine Zeitpunkte haben, wo entweder die ursprüngliche oder die neue Datei nicht vorhanden ist.

    
Paul Tomblin 24.12.2008 18:54
quelle
0

Umbenennen ist ausreichend. Jedoch:

Ist Ihre temporäre Datei für die Rennbedingungen gefährdet? Der Dateiname sollte randomisiert sein, damit niemand Probleme verursachen kann, indem er seine eigene Datei einfügt. Verwenden Sie nach Möglichkeit eine Schnittstelle zu mkstemp ().

    
HUAGHAGUAH 24.12.2008 19:07
quelle

Tags und Links