2012-05-09 3 views
9

Кто-нибудь знает, есть ли способ узнать, доступно ли конкретное расположение файловой системы в песочнице?Mac Sandbox: проверка доступности файла

Я хочу проверить, доступен ли конкретный файл в соответствии с нормальными правилами Powerbox; то есть уже добавлен в блок питания, используя диалог открытия/сохранения и т. д.

Могу ли я сделать это до, вызывая исключение изолированной песочницы?

Могу ли я уловить исключение песочницы?

С наилучшими пожеланиями,

Frank

+0

Мне любопытно, почему вы хотите проверить, доступно ли местоположение. Как правило, вы * указываете *, какие местоположения доступны в правах, а затем получаете доступ к другим файлам через поле «Открыть/сохранить». –

ответ

9

Вы можете использовать системный вызов OS access() для быстрого и простого теста, из man access:

< #include unistd.h >

int access (const char * path, int amode);

Функция access() проверяет доступность файла с именем по пути для разрешений доступа, указанных amode. Значение amode - это побитовое включение ИЛИ разрешений доступа, которые необходимо проверить (R_OK для разрешение на чтение, W_OK для разрешения на запись и X_OK для разрешения на выполнение/поиск ) или тест существования F_OK. Все компоненты пути проверяются на права доступа (включая F_OK).

Если путь не может быть найден или если какой-либо из режимов доступа не будет присвоен , тогда возвращается значение -1, а глобальная целочисленная переменная errno устанавливается для указания ошибки. В противном случае возвращается значение 0.

Вы можете довольно это для Objective-C, используя что-то вроде:

typedef enum 
{ 
    ReadAccess = R_OK, 
    WriteAccess = W_OK, 
    ExecuteAccess = X_OK, 
    PathExists = F_OK 
} AccessKind; 


BOOL isPathAccessible(NSString *path, AccessKind mode) 
{ 
    return access([path UTF8String], mode) == 0; 
} 
+0

Как вы знаете, что это работает с ограничениями Powerbox? Это не традиционные права доступа Unix, вы знаете ... (предположение №1: путь будет таким же, предположение №2: сбой не завершит программу) –

+0

Ну, я попробовал, и он отлично работает. Песочница перехватывает вызовы уровня UNIX, и похоже, что проверка не вызывает никаких сообщений sandboxd. Отлично! Бесконечно благодарен. –

+0

@ DietrichEpp - песочница работает на уровне ОС; то есть «ниже» Cocoa, Posix, Mach и т. д. Вызывается как «access()» учитывать ограничения, наложенные песочницей, ACL и традиционными настройками rwx Unix. – CRD

2

Несколько вещей. Всегда используйте fileSystemRepresentation, когда вам нужна строка пути. Кроме того, R_OK является адекватным, если вы просто хотите знать, есть ли отверстие в песочнице для указанного пути.

-(BOOL)isAccessibleFromSandbox:(NSString*)path 
{ 
    return(access(path.fileSystemRepresentation, R_OK) == 0); 
} 
Смежные вопросы