Frage

Ich habe einen „sicheren Speicher“-Vorgang implementiert, der etwa so aussieht:

  1. Speichern Sie einige Daten in einer temporären Datei A
  2. Kopieren Sie den Inhalt von A zum Endziel B
  3. Löschen A

Ich habe bei Schritt 3 eine Race-Bedingung, bei der Mac OS X gelegentlich mit dem Fehler -47 zurückkehrt (fBsyErr), wenn Sie versuchen, die Datei mit zu löschen FSDeleteObject.Ich bin mir absolut sicher, dass ich der Einzige bin, der diese Datei ändert, und vermute, dass das Betriebssystem zu dem Zeitpunkt, zu dem ich versuche, die Datei zu löschen, etwas tut (z. B. Hintergrund-Caching-Aufgaben), was zu dem Fehler führt.

Dies ist ein zeitweise auftretendes Problem:normalerweise die FSDeleteObject Anruf funktioniert einwandfrei.In den Fällen, in denen ich den Fehlercode zurückerhalte, möchte ich die Datei „zu einem späteren Zeitpunkt“ sicher löschen, wenn das Betriebssystem damit fertig ist.

Was wäre die beste Vorgehensweise, um diese problematische temporäre Datei zu löschen?

War es hilfreich?

Lösung

Hier ist was passiert:

  1. Die häufigste Ursache für FSDeleteObject vorübergehend scheitern mit fBsyErr liegt daran, dass Spotlight gerade dabei ist, die Datei zu indizieren.Wenn Sie eine Datei ändern, schließen Sie sie und versuchen Sie dann sofort, sie mit zu löschen FSDeleteObject, ist es durchaus möglich, dass der Spotlight-Indexer es geöffnet hat und Sie erhalten fBsyErr.
  2. Auch einige Antivirenscanner von Drittanbietern können dieses Problem auslösen.Wenn Sie eine geänderte Datei schließen, beginnt der Antivirenscanner sofort mit der Überprüfung auf Viren.Wenn beim Versuch, die Datei zu löschen, immer noch überprüft wird, FSDeleteObject wird scheitern mit fBsyErr.

Für jedes Problem gibt es eine Reihe von Problemumgehungen. Am besten nutzen Sie beide unlink

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top