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

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

¿Hay alguna forma de obtener la misma semántica en Windows? Sé acerca de MoveFileTransacted () en Vista y Server 2008, pero necesito esto para admitir Win2k y versiones posteriores.

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 incoherente.

He visto a mucha gente decir que esto es imposible en win32, pero te pregunto, ¿en serio?

Por favor, proporcione citas confiables si es posible.

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

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

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.

Interesante artículo aquí en MSDN .

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

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

Establecer este valor garantiza que un movimiento realizado como una operación de copia y eliminación se vacíe en el disco antes de que la función regrese. La descarga ocurre al final de la operación de copia.

Sé que eso 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 hace eso para un movimiento de archivo, debería ser un cambio de nombre más simple.

Un buen número de respuestas, pero no la que esperaba … Entendí (quizás incorrectamente) que MoveFile podría ser atómico siempre que las estrellas adecuadas se alinearan, se usaran banderas y el sistema de archivos fuera el mismo en la fuente que el objective . De lo contrario, la operación volvería a un [Copiar-> Eliminar] Archivo.

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

Alguien dio una charla titulada ” Racing the Filesystem “, que profundiza en esto. (aproximadamente 2 / 3rds hablan de cambio de nombre atómico)

“El pasaje relevante de ese trabajo de investigación de MS:” Under …. ”

Esto sugiere que la operación es atómica, pero es engañosa y solo adecuada para crear confusión. Lo que se requiere es eliminación atómica del archivo anterior y renombrar el nuevo archivo en un paso indivisible . Estas pueden ser dos operaciones de metadatos que en sí mismas son atómicas pero el compuesto NO es atómico.

Comenzando con Windows 10 1607, NTFS admite una operación de cambio de nombre de sustitución atómica. Para hacer esto, 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.