Состояние гонки при вызове FSDeleteObject
-
20-09-2019 - |
Вопрос
Я внедрил операцию "безопасного сохранения", которая выглядит примерно так:
- Сохраните некоторые данные во временный файл
A
- Копировать содержимое
A
к конечному пункту назначенияB
- Удалить
A
У меня есть состояние гонки на шаге 3, когда Mac OS X иногда возвращается с ошибкой -47 (fBsyErr
) при попытке удалить файл с помощью FSDeleteObject
.Я полностью уверен, что я единственный, кто изменяет этот файл, и подозреваю, что ОС что-то делает (например, задачи фонового кэширования) в то время, когда я пытаюсь удалить файл, что приводит к ошибке.
Это временная проблема:обычно FSDeleteObject
вызов работает просто отлично.В тех случаях, когда я получаю код ошибки обратно, я бы хотел безопасно удалить файл "в более поздний момент времени", когда ОС закончит играть с ним.
Каков был бы наилучший план действий при попытке удалить этот вызывающий беспокойство временный файл?
Решение
Вот что происходит:
- Наиболее распространенная причина
FSDeleteObject
временный сбой сfBsyErr
заключается в том, что Spotlight находится в процессе индексации файла.Если вы изменили файл, закройте его, а затем немедленно попробуйте удалить его с помощьюFSDeleteObject
, вполне возможно , что индексатор Spotlight откроет его, и вы получитеfBsyErr
.- Некоторые сторонние антивирусные сканеры также могут вызвать эту проблему.Когда вы закрываете измененный файл, антивирусный сканер немедленно начинает проверять его на наличие вирусов.Если он все еще проверяет, когда вы пытаетесь удалить файл,
FSDeleteObject
потерпит неудачу сfBsyErr
.
Каждая проблема имеет ряд обходных путей, лучшим для обеих является использование unlink