FSDeleteObject перестал работать с fBsyErr, иногда
Q: Я пишу некоторое 'безопасное сохранение' код. Когда я удаляю свой временный файл, FSDeleteObject сбои с fBsyErr (-47), но только иногда. Если я задерживаюсь в течение нескольких секунд и затем повторяю, это работает. Что продолжается?
A: Я пишу некоторое 'безопасное сохранение' код. Когда я удаляю свой временный файл, FSDeleteObject сбои с fBsyErr (-47), но только иногда. Если я задерживаюсь в течение нескольких секунд и затем повторяю, это работает. Что продолжается?
Существует две частых причины для этой проблемы, каждый описанный в последующем разделе. Однако давайте запустимся с некоторой справочной информации.
Ядро Mac OS X поддерживает два, удаляют пути выполнения кода: расцепите и
FSDeleteObject.unlinkпуть выполнения кода реализует традиционную семантику UNIX разрешения Вам удалить открытые файлы.FSDeleteObjectесли файл открыт, реализует традиционную семантику Mac OS возврата ошибки. Эта ошибкаEBUSY, в который переводит Файловый менеджерfBsyErr.При закрытии измененного файла ядро генерирует уведомление, среди других вещей, заставляющее Центр внимания начинать индексировать файл.
Центр внимания
Наиболее распространенная причина FSDeleteObject временно сбой с fBsyErr тот Центр внимания, находится в процессе индексации файла. Если Вы изменяете файл, закрываете его, и затем сразу пытаетесь удалить его использование FSDeleteObject, довольно возможно, что индексатор Центра внимания будет иметь его открытым, и Вы доберетесь fBsyErr.
Существуют многочисленные способы предотвратить эту проблему.
Если при создании файла Вы знаете, что он не должен быть индексирован (например, в Вашем случае, Вы знаете, что это - безопасное временное сохранение), создайте его где-нибудь, что Центр внимания не индексирует, или с именем, заставляющим его не быть индексированным.
Места, которые не будут индексированы Центром внимания, включают:
Стандартный UNIX временный каталог (
/tmp)Временная папка элементов, возвращенная менеджером по Папке с
kTemporaryFolderTypeселектор
Имена, которые не будут индексированы, включают:
Имена, начинающиеся a «.»
Имена, заканчивающиеся «.noindex»
Эти списки не являются исчерпывающими (r. 4823573), потому что полный список того, что не индексирует Центр внимания, вероятно, будет изменяться в течение долгого времени. Однако при использовании одного из упомянутых выше методов необходимо быть совместимы с любой будущей системой.
Предыдущий метод не будет работать, если Вы не можете сказать, заранее, сохранится ли файл (и должен быть индексирован), или нет. В этом случае, если Вы знаете об изменении файла, но он не должен сохранить, удалить файл (использование
unlinkилиFSUnlinkObject) перед закрытием его. Тем путем индексатор Центра внимания никогда не будет вызываться.Также всегда удаляйте использование файлов, расцепляют или
FSUnlinkObject.Когда
FSDeleteObjectсбои сfBsyErr, задержка короткого периода времени и затем повторяет.
Антивирусные сканеры
Некоторые сторонние сканеры антивируса могут также инициировать эту проблему. При закрытии измененного файла антивирусный сканер сразу начинает проверять его на вирусы. Когда Вы пытаетесь удалить файл, если это все еще проверяет FSDeleteObject перестанет работать с fBsyErr.
В этом случае первое обходное решение (опция 1 в предыдущем разделе) не будет работать, потому что нет никаких стандартных расположений или имен, предотвращающих антивирусное сканирование; необходимо будет использовать одну из других опций.
История версии документа
| Дата | Примечания |
|---|---|
| 24.09.2008 | Добавленное примечание, чтобы указать, что с 10,5 (Leopard) - новый Файловый менеджер API был добавлен и добавил описание его. Очищенный грамматические проблемы. |
| 17.11.2006 | Новый документ, что, почему индексация Центра внимания может заставить удаление файла перестать работать, и что делать с этим. |