Bonjour,
J'ai récemment dû créer une fonction de "move avec overwrite" en C#, mais je me suis heurté à de graves problèmes de synchronisation, pouvant résulter en l'effacement du fichier si deux instances de mon programme tournent. Le premier code, vulnérable, ressemblait à ceci:
En urgence, j'ai rajouté un test pour réduire la fenêtre de temps dans laquelle la race condition est possible, mais je sais que ça ne la supprime pas complètement, c'est vraiment du provisoire:
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void MoveWithOverwrite(string sourcePath, string destPath) { File.Delete(destPath); File.Move(sourcePath, destPath); }
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void MoveWithOverwrite(string sourcePath, string destPath) { if(!File.Exists(sourcePath)) throw new MyRaceConditionException(string.Format("Oups! Le fichier '{0}' a déjà été déplacé!", sourcePath)); File.Delete(destPath); File.Move(sourcePath, destPath); }
Maintenant, je voudrais faire un code qui supprime la race condition complètement. J'ai eu une idée qui devrait être la bonne:
- Ouvrir le fichier source en mode exclusif (lancer une exception en cas d'échec)
- Supprimer le fichier à l'emplacement de destination s'il existe
- Fermer le fichier source
- Faire le File.Move (lancer une exception en cas d'échec)
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 void MoveWithOverwrite(string sourcePath, string destPath) { using(File.Open(sourcePath, FileMode.Open, FileAccess.Write, FileShare.None)) { File.Delete(destPath); } File.Move(sourcePath, destPath); }
Mon raisonnement est que si le fichier a déjà été déplacé, l'ouverture en mode exclusif échouera et donc le fichier nouvellement déplacé ne sera pas supprimé. Même s'il se passe quelque chose entre la fermeture et le File.Move, il ne devrait pas y avoir de cas résultant en la suppression du fichier.
Mais je voudrais être sûr, j'ai peut-être oublié quelque chose.
Qu'en pensez-vous?
Partager