È possibile rinominare un file atomico (con sovrascrittura) su Windows?
Domanda
Sui sistemi POSIX rename (2) prevede un'operazione di ridenominazione atomica, inclusa la sovrascrittura del file di destinazione se esiste e se le autorizzazioni lo consentono.
C'è un modo per ottenere la stessa semantica su Windows? Conosco MoveFileTransacted () su Vista e Server 2008, ma ne ho bisogno per supportare Win2k e versioni successive.
La parola chiave qui è atomico ... la soluzione non deve poter fallire in alcun modo che lasci l'operazione in uno stato incoerente.
Ho visto molte persone dire che questo è impossibile su Win32, ma ti chiedo, vero?
Se possibile, fornire citazioni affidabili.
Soluzione
Win32 non garantisce operazioni sui metadati dei file atomici. Fornirei una citazione, ma non ne esiste alcuna: il fatto che non vi sia alcuna garanzia scritta o documentata significa altrettanto.
Dovrai scrivere le tue routine per supportarlo. È un peccato, ma non puoi aspettarti che win32 offra questo livello di servizio - semplicemente non è stato progettato per questo.
Altri suggerimenti
Vedi ReplaceFile ()
in Win32 ( http://research.microsoft.com/pubs/64525/tr-2006-45.pdf )
In Windows Vista e Windows Server 2008 è stata aggiunta una funzione di spostamento atomico - MoveFileTransacted ()
Purtroppo questo non aiuta con le versioni precedenti di Windows.
hai ancora la chiamata rename () su Windows, anche se immagino che le garanzie che desideri non possano essere fatte senza conoscere il filesystem che stai usando - nessuna garanzia se stai usando FAT per esempio.
Tuttavia, è possibile utilizzare MoveFileEx e MOVEFILE_REPLACE_EXISTING e MOVEFILE_WRITE_THROUGH opzioni. Quest'ultimo ha questa descrizione in MSDN:
L'impostazione di questo valore garantisce che a spostamento eseguito come copia ed eliminazione l'operazione viene scaricata sul disco prima la funzione ritorna. Si verifica il flush al termine dell'operazione di copia.
So che non è necessariamente la stessa di un'operazione di ridenominazione, ma penso che potrebbe essere la migliore garanzia che otterrai - se lo fa per uno spostamento di file, dovrebbe per una ridenominazione più semplice.
A partire da Windows 10 1607, NTFS supporta un'operazione di ridenominazione di sostituzione atomica. Per fare questo chiamare NtSetInformationFile (..., FileRenameInformationEx, ...) e specificare il flag FILE_RENAME_POSIX_SEMANTICS. O equivalentemente in Win32 chiama SetFileInformationByHandle (..., FileRenameInfoEx, ...) e specifica il flag FILE_RENAME_FLAG_POSIX_SEMANTICS.
Un discreto numero di risposte ma non quello che mi aspettavo ... Avevo la comprensione (forse erroneamente) che MoveFile poteva essere atomico a condizione che le stelle appropriate fossero allineate, le bandiere fossero usate e il file system era lo stesso sull'origine come destinazione. Altrimenti, l'operazione ricadrebbe in un file [Copia- > Elimina].
Detto questo; Avevo anche capito che MoveFile - quando è atomico - stava semplicemente impostando le informazioni sul file che potevano essere fatte anche qui: setfileinfobyhandle .
Qualcuno ha tenuto un discorso chiamato " Racing the Filesystem " che approfondisce ulteriormente questo aspetto. (circa 2/3 in basso parlano di rinominazione atomica)