76 votes

Est atomique changement de nom de fichier (à écraser) possible sur Windows?

Sur les systèmes POSIX 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 que sur Windows? Je sais que sur MoveFileTransacted() sur Vista et Server 2008, mais j'ai besoin de ce soutien Win2k et jusqu'.

Le mot clé ici est atomique... la solution ne doit pas être en mesure d'échouer en aucune manière que les feuilles de 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?

Veuillez fournir des informations fiables de citations, si possible.

40voto

edg Points 101

20voto

Adam Davis Points 47683

Win32 ne garantit pas atomique fichier de méta-données. 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 pour le soutenir. C'est malheureux, mais vous ne pouvez pas attendre win32 pour fournir ce niveau de service - il n'était tout simplement pas conçu pour cela.

9voto

gbjbaanb Points 31045

vous avez encore le renommer() appel sur Windows, bien que j'imagine que les garanties que vous souhaitez ne peut pas être fait sans le savoir le système de fichiers que vous utilisez aucune garantie si vous utilisez de la GRAISSE, par exemple.

Toutefois, vous pouvez utiliser MoveFileEx et l'utilisation de la MOVEFILE_REPLACE_EXISTING et MOVEFILE_WRITE_THROUGH options. Ce dernier a cette description dans MSDN:

La définition de cette valeur garantit qu'un déplacer effectués en tant que de copier et de 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 changement de nom, mais je pense qu'il pourrait être la meilleure garantie que vous obtiendrez - si ce n'est que pour un déplacement de fichier, il devrait pour un simple changement de nom.

3voto

sehafoc Points 1

Un bon nombre de réponses, mais pas celui que je m'attendais... j'ai eu le comprendre (peut-être à tort) que MoveFile pourrait être atomique, à condition que les astres s'alignent, les drapeaux ont été utilisés, et le système de fichiers a été le même sur la source et cible. Sinon, l'opération devrait revenir à un Copier/DeleteFile. Étant donné que; j'ai également eu la compréhension que MoveFile -- quand il est atomique -- était juste mettre le fichier d'information qui pourrait également être fait ici: setfileinfobyhandle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X