¿Es posible cambiar el nombre de un archivo atómico (con sobrescritura) en Windows?

StackOverflow https://stackoverflow.com/questions/167414

  •  03-07-2019
  •  | 
  •  

Pregunta

En los sistemas POSIX, rename (2) proporciona una operación de cambio de nombre atómico, incluida la sobrescritura del archivo de destino si existe y si los permisos lo permiten.

¿Hay alguna manera de obtener la misma semántica en Windows? Sé sobre MoveFileTransacted () en Vista y Server 2008, pero necesito esto para ser compatible con Win2k y más.

La palabra clave aquí es atómica ... la solución no debe poder fallar de ninguna manera que deje la operación en un estado inconsistente.

He visto a muchas personas decir que esto es imposible en win32, pero te pregunto si es verdad.

Por favor proporcione citas confiables si es posible.

¿Fue útil?

Solución

Win32 no garantiza operaciones de metadatos de archivos atómicos. Proporcionaría una cita, pero no hay ninguna, el hecho de que no haya una garantía escrita o documentada significa tanto.

Tendrás que escribir tus propias rutinas para admitir esto. Es desafortunado, pero no puede esperar que win32 brinde este nivel de servicio, simplemente no fue diseñado para ello.

Otros consejos

En Windows Vista y Windows Server 2008 se ha agregado una función de movimiento atómico - MoveFileTransacted ()

Lamentablemente, esto no ayuda con las versiones anteriores de Windows.

Artículo interesante aquí en MSDN .

todavía tiene la llamada rename () en Windows, aunque imagino que las garantías que desea no pueden realizarse sin saber el sistema de archivos que está utilizando, no hay garantías si está utilizando FAT, por ejemplo.

Sin embargo, puede usar MoveFileEx y usar MOVEFILE_REPLACE_EXISTING  y opciones de MOVEFILE_WRITE_THROUGH. Este último tiene esta descripción en MSDN:

  

Establecer este valor garantiza que un   mover realizado como una copia y eliminar   la operación se descarga al disco antes   La función vuelve. Se produce la descarga   al final de la operación de copia.

Sé que no es necesariamente lo mismo que una operación de cambio de nombre, pero creo que podría ser la mejor garantía que obtendrás: si lo hace para mover un archivo, debería hacerlo para un cambio de nombre más simple.

A partir de Windows 10 1607, NTFS admite una operación de cambio de nombre sustitutiva atómica. Para hacerlo, llame a NtSetInformationFile (..., FileRenameInformationEx, ...) y especifique el indicador FILE_RENAME_POSIX_SEMANTICS. O de manera equivalente en Win32, llame a SetFileInformationByHandle (..., FileRenameInfoEx, ...) y especifique el indicador FILE_RENAME_FLAG_POSIX_SEMANTICS.

Un buen número de respuestas, pero no la que esperaba ... Tenía el entendimiento (quizás incorrectamente) de que MoveFile podría ser atómico siempre que se alinearan las estrellas adecuadas, se usaron las banderas y El sistema de archivos era el mismo en la fuente que el destino. De lo contrario, la operación recaería en un archivo [Copiar > Eliminar].

Dado eso; También entendí que MoveFile, cuando es atómico, estaba configurando la información del archivo que también se podía hacer aquí: setfileinfobyhandle .

Alguien dio una charla llamada " Racing the Filesystem " que profundiza un poco más sobre esto. (alrededor de 2 / 3rds abajo hablan del cambio de nombre atómico)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top