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.

È stato utile?

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

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.

Articolo interessante qui su MSDN .

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top