Получение разрешений на создание новой папки с помощью NSFileManager - PullRequest
0 голосов
/ 30 марта 2012

У меня возникают некоторые проблемы при попытке создать папку с помощью NSFileManager в MacOS X. Я создаю программное обеспечение в Lion, если это что-то изменит.

В любом случае. Структура программы выглядит примерно так:

  1. Заполните некоторые поля.
  2. Выберите папку с помощью NSOpenPanel.
  3. Программа генерирует имя новой папки из полей.
  4. Создать папку с таким именем в выбранной папке.

Код, который должен создать папку, выглядит следующим образом:

NSString *name = [pnameField stringValue];
NSString *number = [self parseVerknr:[pnumberField stringValue]];
NSString *date = [pdateField stringValue];
NSString *folderName;

//Here I generate the folder name from some rules and stuffsies
//It ends up as something like: 13245_08 - cp. - name

NSOpenPanel *myPanel = [NSOpenPanel openPanel];

    myPanel.canChooseFiles = NO;
    myPanel.canChooseDirectories = YES;
    myPanel.canCreateDirectories = YES;

    [myPanel beginWithCompletionHandler:^(NSInteger result){

        if (result==NSFileHandlingPanelOKButton){

            NSFileManager *myManager = [[NSFileManager alloc] init];

            NSError *merror;

            NSString *directoryString = [NSString stringWithFormat:@"%@%@", [myPanel.URL absoluteString], folderName];

            //Here the directory string looks like file://localhost/Users/username/Documents/folders/12345_09 - cp. - Koop
            directoryString = [directoryString substringFromIndex:6];
            //After it looks like: /localhost/Users/username/Documents/folders/12345_09 - cp. - Koop
            NSLog(@"directory: %@", directoryString);

            [myManager createDirectoryAtPath:directoryString withIntermediateDirectories:YES attributes:nil error:&merror];

            NSLog(@"%@", [merror localizedDescription] );
        }

    }];

Если я не беру подстроку из индекса 6, я получаю большой стек ошибок (попытался взять его также и из 16, который сделал то же самое). Если я использую разделенную строку, я получаю следующую ошибку:

You don’t have permission to save the file “localhost” in the folder “PK Bear”.

Поскольку PK Bear - это имя моего "жесткого диска", я полагаю, что программе необходимо получить разрешение на доступ к жесткому диску. Я просто не знаю, как это сделать.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 30 марта 2012

Вы путаете (file-) URL и (unix) пути.

Вы должны создать путь к каталогу следующим образом:

NSString *directoryString = [[myPanel.URL path] stringByAppendingPathComponent:folderName];
if (! [myManager createDirectoryAtPath:directoryString withIntermediateDirectories:YES attributes:nil error:&merror]) {
    NSLog(@"%@", [merror localizedDescription]);
}

Ключ использует path вместо absoluteString.

Кроме того: Вы не можете получить доступ к объекту merror, если только метод, который его создает, не возвращает NO (или что-то еще из условия ошибки).

Вы никогда не должны возиться с одиночными символами в строках пути (как вы это делали с substringFromIndex:). Это считается сложной задачей перед лицом точек кода Unicode против фрагментов кода и комбинированных символов.

1 голос
/ 30 марта 2012

Проблема в том, как вы создаете строку пути.В частности, -[NSURL absoluteString] возвращает строковое представление URL, а не строку пути к файлу.Вы должны использовать методы NSURL и NSString для работы с путями.Как описано в документации , -[NSURL path] возвращает строку пути, подходящую для ввода в методы NSFileManager.

Попробуйте это:

NSString *directoryString = [[myPanel.URL path] stringByAppendingPathComponent:folderName];
[myManager createDirectoryAtPath:directoryString withIntermediateDirectories:YES attributes:nil error:&merror];
...