2008-12-24 8 views
8

Tengo una situación muy común. Tengo un archivo y necesito sobrescribirlo por completo con nuevos contenidos. Sin embargo, se accede al archivo original en cada carga de página (esta es una aplicación web), por lo que no puede faltar por mucho tiempo. Unos pocos ms está bien (aunque no es ideal), un segundo no está bien.¿Cuál es la mejor manera de hacer un reemplazo de archivos atómicos multiplataforma en Perl?

Ahora hago esto escribiendo un archivo temporal en el mismo directorio y luego cambiando el nombre de ese archivo temporal al nombre del nuevo archivo. Solo estoy usando File :: Temp normal y "rename" para hacer esto, en Perl. Me preguntaba: ¿hay alguna otra forma recomendada/mejor para hacer esto? Preferiblemente uno que no requiere un módulo CPAN, ya que este es el único lugar en mi sistema que necesito para hacer esto, y no quiero una dependencia completamente nueva solo para esto.

Ah, y todo esto tiene que funcionar en Windows, Linux, BSD, OS X, Solaris y en la mayoría de las otras plataformas comunes.

Here is the code in question, para aquellos interesados.

Respuesta

10

Su método parece estar bien. Es rápido, es atómico, solo utiliza módulos principales, y File :: Temp es una forma segura de manejar archivos temporales. ¿Qué más necesitas?

+0

Bueno, posiblemente solo una confirmación de que esta es la mejor manera. :-) Principalmente me preguntaba si había alguna otra manera particularmente recomendada de hacerlo, ya que de todos modos estaba buscando el código en cuestión (para arreglar un error) y pensé que sería un buen momento para mejorarlo si fuera necesario. . :-) –

+0

La operación de movimiento es atómica, por lo que es un buen camino a seguir. – Danny

6

Lo haría de la misma manera que lo haces. Al menos en los SO de tipo Unix, se garantiza que el cambio de nombre de un archivo sea atómico, por lo que no tendrá instantes donde el archivo original o el nuevo no estén allí.

0

Renombrar es suficiente. Sin embargo:

¿Su archivo temporal está en riesgo por condiciones de carrera? El nombre del archivo debe ser aleatorio para que nadie pueda causar problemas al insertar su propio archivo. Use una interfaz para mkstemp() si es posible.

+2

Estoy bastante seguro de que File: Temp está correctamente aleatorizado. –

+0

Sí, File :: Temp está correctamente aleatorizado, para eso está XXXXX en el código. –

+1

File :: Temp es el equivalente de Perl de mkstemp & friends, y fue escrito teniendo muy en cuenta la seguridad. – ysth

Cuestiones relacionadas