Ошибка NSFileWriteNoPermissionError при попытке создать новый каталог в /Library /Application Support/

#cocoa #permissions #directory #nsfilemanager

#cocoa #разрешения #каталог #nsfilemanager

Вопрос:

Следующий код возвращает NSCocoaErrorDomain с кодом ошибки 513 (NSFileWriteNoPermissionError) при запуске из xcode.

 NSError *error;

[[NSFileManager defaultManager] 
createDirectoryAtPath:@"/Library/Application Support/myapp" 
withIntermediateDirectories:YES 
attributes:nil 
error:amp;error];
  

Это на Mac OS X 10.6.7, указанный каталог не существует, и мой пользователь имеет права администратора.

Цель состоит в том, чтобы сохранить файлы поддержки приложений, которые являются общими для пользователей. Разве не должны быть разрешения на запись для создания этого каталога?

Ответ №1:

Нет, это системная папка библиотеки. Вам нужна библиотека пользователя в «~/Library/». Вы могли бы попробовать:

 [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/myapp"]
  

или:

 NSArray * paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
NSString * appSupportPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"myapp"];
  

Для еще одного варианта вы также можете получить URL-адрес из файлового менеджера:

 NSFileManager * fm = [[NSFileManager alloc] init];
NSArray * urls = [fm URLsForDirectory:NApplicationSupportDirectory inDomains:NSUserDomainMask];
NSURL * appSupportURL = [urls objectAtIndex:0];
  

Комментарии:

1. Ну, это каталог «Application Support», поэтому я не понимаю, почему мое приложение не могло его использовать. Кроме того, я вижу там множество папок из других приложений, которые я установил на свой Mac. Кроме того, идея в том, что я хочу сохранить файлы, которые являются общими для пользователей, поэтому я не использую каталог ~/Library /Application Support .

2. @user497804: пользователь, даже если он администратор, не является владельцем /Library, и поэтому ваше приложение не может писать туда без получения авторизации, что обычно делается путем появления диалогового окна с запросом пользователя на аутентификацию. Я думаю, что вам нужно заглянуть в службы авторизации .