condition de course lors de l'appel FSDeleteObject
-
20-09-2019 - |
Question
Je l'ai mis en place une opération « sauvegarde sécurisée » qui ressemble à ceci:
- Enregistrer des données à
A
de fichier temporaire - Copier le contenu de
A
àB
destination finale - Supprimer
A
J'ai une condition de course à l'étape 3, où Mac OS X à l'occasion de revenir avec l'erreur -47 (fBsyErr
) lorsque vous essayez de supprimer le fichier en utilisant FSDeleteObject
. Je suis, je suis tout à fait confiant la seule modification de ce fichier et soupçonne que le système d'exploitation est en train de faire quelque chose (par exemple, les tâches de mise en cache de fond) au moment où je tente de supprimer le fichier, ce qui entraîne l'erreur.
Ceci est un problème intermittent: normalement l'appel FSDeleteObject
fonctionne très bien. Dans les cas où je reçois le code d'erreur de retour, je voudrais supprimer en toute sécurité le fichier « à une date ultérieure dans le temps » lorsque le système d'exploitation est fini de jouer avec elle.
Quel serait le meilleur plan d'action à prendre pour tenter de supprimer ce fichier temporaire gênant?
La solution
est ce qui se passe:
- La cause la plus fréquente de
FSDeleteObject
ne temporairementfBsyErr
est que Spotlight est en train d'indexer le fichier. Si vous modifiez un fichier, fermez-le, puis immédiatement essayer de supprimer à l'aideFSDeleteObject
, il est tout à fait possible que le projecteur indexeur aura ouvert et vous aurezfBsyErr
.- Certains tiers scanners anti-virus peuvent également déclencher ce problème. Lorsque vous fermez un fichier modifié, le scanner antivirus commence immédiatement à vérifier pour les virus. Si elle est en train de vérifier lorsque vous essayez de supprimer le fichier,
FSDeleteObject
échouera avecfBsyErr
.
Chaque problème a une série de solutions de contournement, le meilleur pour les deux est d'utiliser unlink