Я работаю над приложением MacOS в XCode 10.2.Это приложение на разных языках (C, Objective-C и Swift).В части C он использует некоторые низкоуровневые вызовы unistd, в частности stat () и access ().
У меня есть строка пути к читаемому текстовому файлу в подкаталоге / usr / local /.Все соответствующие каталоги, начиная с / usr и ниже, имеют установленный атрибут 'r'.Строка пути правильная, потому что когда я вызываю stat () с использованием строки пути, stat () возвращается успешно, и когда я проверяю его результат, он действительно помечается как файл, а не как каталог.
Но затем, когда я вызываю access (path, R_OK) для него, access () возвращает ошибку с errno, установленным в 1 (EPERM), даже если «ls -l» в терминале показывает файл как имеющий доступ для чтения длявсе 3 уровня: -rw-r - r -
#include <unistd.h>
#include <sys/errno.h>
#include <sys/stat.h> // For S_ISDIR() macro
...
struct stat info;
if (stat(&info, path) != nil) {
if (!S_ISDIR(info.st_mode)) {
if (access(path, R_OK)==0) { // <-- Fails here
return(0);
}
}
}
return(errno);
Если я игнорирую вызов access (), а затем вызываю fopen () на пути, я также получаю там ошибку ввода-вывода.
Я читал, что в последних версиях MacOS (Mojave?) Должен быть список приложений, которые имеют разрешение на общий доступ к диску низкого уровня.Этим списком можно управлять только на панели «Системные настройки безопасности».Но я не могу использовать средство выбора приложений там, чтобы выбрать, что именно XCode работает, пока я отлаживаю и разрабатываю, который скрыт глубоко в каком-то дереве XCode в Библиотеке (которое в любом случае не отображается в списке приложений панели настроек).
Я просто хочу программно определить, доступен ли текстовый файл в дереве / usr / local / ... для чтения, а затем прочитать его.