C++/Win32 :Comment attendre la fin d'une suppression en attente

C++/Win32 :Comment attendre la fin d'une suppression en attente

Il existe d'autres processus dans Windows qui veulent un morceau de ce fichier. L'indexeur de recherche est un candidat évident. Ou un antivirus. Ils ouvriront le fichier pour un partage complet, y compris FILE_SHARE_DELETE, afin que les autres processus ne soient pas fortement affectés par l'ouverture du fichier.

Cela fonctionne généralement bien, sauf si vous créez/écrivez/supprimez à un rythme élevé. La suppression réussira, mais le fichier ne peut pas disparaître du système de fichiers tant que le dernier handle de celui-ci n'a pas été fermé. Le handle tenu par, disons, l'indexeur de recherche. Tout programme qui essaie d'ouvrir ce fichier en attente de suppression sera frappé par l'erreur 5.

Il s'agit par ailleurs d'un problème générique sur un système d'exploitation multitâche, vous ne pouvez pas savoir quel autre processus pourrait vouloir gâcher vos fichiers. Votre mode d'utilisation semble inhabituel, examinez-le d'abord. Une solution de contournement serait d'attraper l'erreur, de dormir et de réessayer. Ou déplacer le fichier dans la corbeille avec SHFileOperation().


Renommez d'abord le fichier à supprimer, puis supprimez-le.

Utilisez GetTempFileName() pour obtenir un nom unique, puis utilisez MoveFile() pour renommer le fichier. Supprimez ensuite le fichier renommé. Si la suppression réelle est effectivement asynchrone et peut entrer en conflit avec la création du même fichier (comme vos tests semblent l'indiquer), cela devrait résoudre le problème.

Bien sûr, si votre analyse est correcte et que les opérations sur les fichiers se produisent de manière quelque peu asynchrone, cela peut introduire le problème que vous tentez de supprimer le fichier avant que le changement de nom ne soit terminé. Mais vous pouvez toujours continuer à essayer de supprimer dans un fil de discussion en arrière-plan.

Si Hans a raison (et j'ai tendance à croire son analyse), le déplacement peut ne pas vraiment aider, car vous ne pourrez peut-être pas renommer un fichier ouvert par un autre processus. (Mais alors vous pourriez, je ne le sais pas.) Si c'est effectivement le cas, la seule autre façon que je peux trouver est "continuez d'essayer". Vous devrez attendre quelques millisecondes et réessayer. Gardez un délai d'attente pour abandonner lorsque cela n'aide pas.


Suggestion stupide - puisqu'elle échoue si rarement, attendez simplement quelques millisecondes en cas d'échec et réessayez.

Ou, si la latence est importante, passez à un autre nom de fichier, en laissant l'ancien fichier être supprimé plus tard.