Вопрос

Я внедрил операцию "безопасного сохранения", которая выглядит примерно так:

  1. Сохраните некоторые данные во временный файл A
  2. Копировать содержимое A к конечному пункту назначения B
  3. Удалить A

У меня есть состояние гонки на шаге 3, когда Mac OS X иногда возвращается с ошибкой -47 (fBsyErr) при попытке удалить файл с помощью FSDeleteObject.Я полностью уверен, что я единственный, кто изменяет этот файл, и подозреваю, что ОС что-то делает (например, задачи фонового кэширования) в то время, когда я пытаюсь удалить файл, что приводит к ошибке.

Это временная проблема:обычно FSDeleteObject вызов работает просто отлично.В тех случаях, когда я получаю код ошибки обратно, я бы хотел безопасно удалить файл "в более поздний момент времени", когда ОС закончит играть с ним.

Каков был бы наилучший план действий при попытке удалить этот вызывающий беспокойство временный файл?

Это было полезно?

Решение

Вот что происходит:

  1. Наиболее распространенная причина FSDeleteObject временный сбой с fBsyErr заключается в том, что Spotlight находится в процессе индексации файла.Если вы изменили файл, закройте его, а затем немедленно попробуйте удалить его с помощью FSDeleteObject, вполне возможно , что индексатор Spotlight откроет его, и вы получите fBsyErr.
  2. Некоторые сторонние антивирусные сканеры также могут вызвать эту проблему.Когда вы закрываете измененный файл, антивирусный сканер немедленно начинает проверять его на наличие вирусов.Если он все еще проверяет, когда вы пытаетесь удалить файл, FSDeleteObject потерпит неудачу с fBsyErr.

Каждая проблема имеет ряд обходных путей, лучшим для обеих является использование unlink

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top