2010-02-11 4 views
0

я реализовал «безопасный сохранить» операции, которая идет что-то вроде этого:гонки условие при вызове FSDeleteObject

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

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

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

Что было бы лучшим способом предпринять, пытаясь удалить этот неприятный временный файл?

ответ

0

Here's что происходит:

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

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

Смежные вопросы