Un fichier atomique peut-il être renommé (avec réécriture) sur Windows?

Sur POSIX systèmes de renommer(2) prévoit atomique de l'opération, y compris l'écrasement du fichier de destination si elle existe et si les autorisations autoriser.

est-il possible d'obtenir la même sémantique sur Windows? Je connais MoveFileTransacted () sur Vista et Server 2008, mais j'en ai besoin pour supporter Win2k et up.

Le mot clé ici est atomique ... la solution ne doit pas pouvoir échouer d'une manière qui laisse l'opération dans un état incohérent.

j'ai vu beaucoup de personnes disent que c'est impossible sur win32, mais je vous demande, est-il vraiment?

prière de fournir des citations fiables si possible.

57
demandé sur teratorn 2008-10-03 19:25:25

7 réponses

Win32 ne garantit pas les opérations de méta-données du fichier atomique. J'aimerais fournir une citation, mais il n'en fait qu'il n'y a pas écrit ou documentés garantie d'autant.

Vous allez avoir à écrire vos propres routines. C'est regrettable, mais vous ne pouvez pas vous attendre à ce que win32 fournisse ce niveau de service - il n'a tout simplement pas été conçu pour cela.

15
répondu Adam Davis 2017-12-04 11:39:35
31
répondu edg 2011-08-26 06:41:49

dans Windows Vista et Windows Server 2008 une fonction atomic move a été ajoutée - MoveFileTransacted ()

malheureusement, cela ne fonctionne pas avec les anciennes versions de Windows.

article intéressant ici sur MSDN .

14
répondu Uwe Keim 2017-12-03 21:46:31

vous avez toujours l'appel rename() sur Windows, bien que j'imagine que les garanties que vous voulez ne peuvent pas être faites sans connaître le système de fichiers que vous utilisez - aucune garantie si vous utilisez FAT par exemple.

cependant, vous pouvez utiliser MoveFileEx et utiliser le MOVEFILE_REPLACE_EXISTING et MOVEFILE_WRITE_THROUGH options. Ce dernier a cette description dans MSDN:

cette valeur garantit qu'un déménagement effectué qu'une copie et supprimer l'opération est vidé à disque avant la fonction retourne. La chasse d'eau se produit à la fin de l'opération de copie.

je sais que ce n'est pas nécessairement la même chose qu'une opération de renommage, mais je pense que cela pourrait être la meilleure garantie que vous obtiendrez - s'il fait cela pour un déplacement de fichier, il devrait pour un renommage plus simple.

8
répondu gbjbaanb 2008-10-03 15:39:18

un bon nombre de réponses, mais pas celle que j'attendais... J'ai eu la compréhension (peut-être incorrectement) que MoveFile pourrait être atomique à condition que les étoiles appropriées alignées, les drapeaux ont été utilisés, et le système de fichiers était le même sur la source que la cible. Sinon, l'opération retomberait sur un fichier [Copy->Delete].

étant donné que; j'avais aussi la compréhension que MoveFile -- quand il est atomique -- était en train de définir le fichier informations qui pourraient également être faites ici: setfileinfobyhandle .

Quelqu'un a donné une conférence appelée Racing the Filesystem " qui va plus en profondeur à ce sujet. (environ 2/3rds bas ils parlent atomique renommer)

2
répondu sehafoc 2018-08-16 23:51:33

"Le passage pertinent de cette recherche sur la sp papier: "en Vertu de l' ...."

C'est suggérant que l'opération est atomique, mais elle est trompeuse et ne convient qu'à créer la confusion. Ce qu'il faut, c'est supprimer atomique de l'ancien fichier et renommer le nouveau fichier en un pas indivisible . Il peut s'agir de deux opérations de métadonnées qui sont en soi atomiques, mais le composé n'est pas atomique.

1
répondu Johannes 2012-02-22 14:45:34

à partir de Windows 10 1607, NTFS supporte une opération de renommage atomique. Pour faire cet appel NtSetInformationFile(..., FileRenameInformationEx,...) et spécifiez L'option FILE_RENAME_POSIX_SEMANTICS. Ou de manière équivalente dans Win32 call Setfileinformation Byhandle(..., FileRenameInfoEx,...) et spécifiez L'option FILE_RENAME_FLAG_POSIX_SEMANTICS.

1
répondu Craig Barkhouse 2018-08-08 01:53:05