Как получить список файлов директории os x?

Разрабатываю приложение на objective c. Пользователь выбирает директорию (использую NSOpenPanel) и после в приложении отображается список файлов этой директории. В этом проблем нет. Однако если же открыть приложение поновой и не выбирая директорию через NSOpenPanel, сразу захотеть получить список файлов в выбранной в прошлом запуске директории, то происходит ошибка NSCocoaErrorDomain Code=257.
Подозреваю, что если пользователь выбирает директорию вручную через NSOpenPanel, то система каким-то образом запоминает это и дает доступ на чтение этой директории и получение ее файлов (использую метод contentsOfDirectoryAtPath), а если пользователь не выбирает через NSOpenPanel директорию и пытается получить список ее файлов, то генерируется ошибка доступа. Как же быть в этом случае?
  • Вопрос задан
  • 2500 просмотров
Пригласить эксперта
Ответы на вопрос 2
This_man
@This_man Автор вопроса
@Cassar: Упрощенно так:
Если выполняется вызов NSOpenPanel
NSOpenPanel *panel = [[NSOpenPanel alloc] init];
    [panel setCanChooseDirectories:YES];
    [panel setCanChooseFiles:NO];
    [panel setAllowsMultipleSelection:NO];
    if([panel runModal] == NSOKButton){
      ...
}


то следующий код также выполняется без ошибок
NSArray *urls = [panel URLs];
NSArray *dirs = [[NSFileManager defaultManager] contentsOfDirectoryAtPath: [urls[0] path] error:&err];

Если же NSOpenPanel не вызывается, т.е. я знаю путь к директории, то нижний код выполняется с ошибкой.
Ответ написан
Комментировать
@Cassar
@This_man
Во-первых, [panel URLs]
возвращает массив NSURL-ов, и для использования их в contentsOfDirectoryAtPath: нужно преобразовать в NSString c помощью absoluteString или path, как у Вас.
Во-вторых, код вида
NSError *error = nil;
NSArray *arr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"//" error:&error];
NSLog(@"%@", arr);

вполне корректно отрабатывает, демонстрируя содержание корневой папки, не требуя никаких дополнительных пермишенов. Проверяйте значения своих переменных.

Кстати, отличный сниппет для резолва путей:
- (NSString *)resolvePath:(NSString *)path {
    NSString *expandedPath = [[path stringByExpandingTildeInPath] stringByStandardizingPath];
    const char *cpath = [expandedPath cStringUsingEncoding:NSUTF8StringEncoding];
    char *resolved = NULL;
    char *returnValue = realpath(cpath, resolved);

    if (returnValue == NULL && resolved != NULL) {
        printf("Error with path: %s\n", resolved);
        // if there is an error then resolved is set with the path which caused the issue
        // returning nil will prevent further action on this path
        return nil;
    }

    return [NSString stringWithCString:returnValue encoding:NSUTF8StringEncoding];
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы