2008-12-24 5 views
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.Was ist der beste Weg für eine plattformübergreifende, atomare Dateiersetzung in Perl?

Jetzt mache ich dies, 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 eine, die kein CPAN-Modul benötigt, da dies die einzige Stelle in meinem System ist, die ich dazu brauche, und ich möchte nicht nur eine ganz neue Abhängigkeit dafür haben.

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

Here is the code in question, für diejenigen interessiert.

Antwort

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 brauchst du mehr?

+0

Nun, möglicherweise nur eine Bestätigung, dass dies wirklich der beste Weg ist. :-) Ich habe mich meistens gefragt, ob es eine andere besonders empfehlenswerte Methode gibt, da ich sowieso den betreffenden Code angeschaut habe (um einen Bug zu beheben) und ich dachte mir, dass es jetzt ein guter Zeitpunkt wäre, ihn zu verbessern . :-) –

+0

Die Bewegung ist atomar, also ist das ein guter Weg. – Danny

6

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

0

Umbenennen ist ausreichend. Jedoch:

Ist Ihre temporäre Datei für Race Conditions 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().

+2

Ich bin mir ziemlich sicher, dass Datei: Temp richtig randomisiert ist. –

+0

Yeah, File :: Temp ist richtig randomisiert, dafür steht der XXXXX im Code. –

+1

File :: Temp ist das Perl-Äquivalent von mkstemp & friends und wurde sehr sicherheitsbewusst geschrieben. – ysth

Verwandte Themen