Apple рекомендует не полагаться на метод fileExistAtPath:. Часто лучше просто попытаться открыть файл и устранить ошибку, если файл не существует.
Ссылка на класс NSFileManager
Примечание. Попытка предиката поведения на основе текущего состояния файловой системы или конкретного файла в файловой системе не рекомендуется. Это может вызвать странное поведение или расы. Гораздо лучше попытаться выполнить операцию (например, загрузить файл или создать каталог), проверить ошибки и изящно обработать эти ошибки, чем пытаться заранее выяснить, будет ли операция успешной. Для получения дополнительной информации об условиях гонки файловой системы см. «Условия гонки и безопасные операции с файлами» в Руководстве по безопасному кодированию.
Из руководства по безопасному кодированию.
Чтобы предотвратить это, программы часто проверяют, чтобы временный файл с определенным именем еще не существовал в целевом каталоге. Если такой файл существует, приложение удаляет его или выбирает новое имя для временного файла, чтобы избежать конфликта. Если файл не существует, приложение открывает файл для записи, потому что системная процедура, которая открывает файл для записи, автоматически создает новый файл, если его не существует. Злоумышленник, непрерывно запуская программу, которая создает новый временный файл с соответствующим именем, может (с небольшой настойчивостью и некоторой удачей) создать файл в промежутке между проверкой приложения, чтобы убедиться, что временный файл не существует. и когда он открывает его для записи. Затем приложение открывает файл злоумышленника и записывает в него (помните, системная процедура открывает существующий файл, если он есть, и создает новый файл, только если нет существующего файла). Файл злоумышленника может иметь другие права доступа, чем временный файл приложения, поэтому злоумышленник может прочитать содержимое. Кроме того, у злоумышленника может быть файл уже открыт. Злоумышленник может заменить файл жесткой ссылкой или символической ссылкой на другой файл (файл, принадлежащий злоумышленнику, или существующий системный файл). Например, злоумышленник может заменить файл символической ссылкой на файл системных паролей, чтобы после атаки системные пароли были повреждены до такой степени, что никто, включая системного администратора, не сможет войти в систему. Кроме того, у злоумышленника может быть файл уже открыт. Злоумышленник может заменить файл жесткой ссылкой или символической ссылкой на другой файл (файл, принадлежащий злоумышленнику, или существующий системный файл). Например, злоумышленник может заменить файл символической ссылкой на файл системных паролей, чтобы после атаки системные пароли были повреждены до такой степени, что никто, включая системного администратора, не сможет войти в систему. Кроме того, у злоумышленника может быть файл уже открыт. Злоумышленник может заменить файл жесткой ссылкой или символической ссылкой на другой файл (файл, принадлежащий злоумышленнику, или существующий системный файл). Например, злоумышленник может заменить файл символической ссылкой на файл системных паролей, чтобы после атаки системные пароли были повреждены до такой степени, что никто, включая системного администратора, не сможет войти в систему.