È ansible rinominare un file atomico (con sovrascrittura) su Windows?

Su POSIX systems rename (2) fornisce 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? So di MoveFileTransacted () su Vista e Server 2008, ma ho bisogno di questo per supportare Win2k e versioni successive.

La parola chiave qui è atomica … la soluzione non deve essere in grado di fallire in alcun modo che lasci l’operazione in uno stato incoerente.

Ho visto molte persone dire che questo è imansible su win32, ma ti chiedo, è davvero?

Si prega di fornire citazioni affidabili, se ansible.

In Windows Vista e Windows Server 2008 è stata aggiunta una funzione di spostamento atomico – MoveFileTransacted ()

Sfortunatamente questo non aiuta con le versioni precedenti di Windows.

Articolo interessante qui su MSDN .

hai ancora la chiamata a rename () su Windows, anche se immagino che le garanzie che vuoi non possano essere fatte senza conoscere il filesystem che stai usando – nessuna garanzia se stai usando FAT per esempio.

Tuttavia, puoi utilizzare MoveFileEx e utilizzare le opzioni MOVEFILE_REPLACE_EXISTING e MOVEFILE_WRITE_THROUGH. Quest’ultimo ha questa descrizione in MSDN:

L’impostazione di questo valore garantisce che una mossa eseguita come un’operazione di copia ed eliminazione venga scaricata su disco prima che la funzione ritorni. Lo svuotamento si verifica alla fine dell’operazione di copia.

So che non è necessariamente la stessa operazione di ridenominazione, ma penso che potrebbe essere la migliore garanzia che si otterrà – se lo fa per un trasferimento di file, dovrebbe per una ridenominazione più semplice.

Un discreto numero di risposte ma non quello che mi aspettavo … Ho avuto la comprensione (forse errata) che MoveFile potesse essere atomico a condizione che le stelle corrette fossero allineate, che fossero usate le bandiere e che il file system fosse lo stesso sulla sorgente come bersaglio . In caso contrario, l’operazione tornerebbe a un file [Copia-> Elimina].

Dato che; 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 dal titolo ” Racing the Filesystem “, che approfondisce la questione. (circa 2/3 si parla di rinominazione atomica)

“Il passaggio rilevante da quel documento di ricerca MS:” Sotto …. ”

Questo sta suggerendo che l’operazione è atomica, ma è fuorviante e adatta solo a creare confusione. Ciò che è richiesto è l’eliminazione atomica del vecchio file e la rinomina del nuovo file in un unico passaggio indivisibile . Queste possono essere due operazioni di metadati che di per sé sono atomiche ma il composto NON è atomico.

A partire da Windows 10 1607, NTFS supporta un’operazione di ridenominazione atomica sostitutiva. Per effettuare questa operazione, chiama NtSetInformationFile (…, FileRenameInformationEx, …) e specifica il flag FILE_RENAME_POSIX_SEMANTICS. O in modo equivalente nella chiamata Win32 SetFileInformationByHandle (…, FileRenameInfoEx, …) e specificare il flag FILE_RENAME_FLAG_POSIX_SEMANTICS.