Сохранение CFPropertyLists в папку пользователя - PullRequest
0 голосов
/ 17 марта 2010

Я пытаюсь сохранить CFPropertyList в папку в домашней папке пользователя. Используя код ниже, я получаю errorCode = -10 (неизвестная ошибка).

CFURLRef fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR("~/testfile.txt"),  kCFURLPOSIXPathStyle, false );  

SInt32 errorCode;
Boolean status = CFURLWriteDataAndPropertiesToResource(fileURL, xmlData, NULL, &errorCode);

Если я изменю путь на что-то вроде "/testfile.txt" без '~', тогда все будет работать. Как сохранить список свойств в домашнюю папку текущего пользователя? Нужно сначала получить имя пользователя и включить его в путь, например /users/toffler/testfile.txt?

Ответы [ 2 ]

3 голосов
/ 17 марта 2010

С помощью Foundation вы можете вызвать функцию NSHomeDirectory , чтобы получить абсолютный путь к домашнему каталогу пользователя.Затем вы можете использовать методы манипулирования путями из NSString или из NSURL , или эквивалентную функцию для CFURL , чтобы привязать к нему подпуть.

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

  • Если вы хотите сохранить файл назапрос пользователя, запустите панель сохранения , а затем сохраните ее в том месте, куда пользователь сказал вам.
  • Если вы хотите сохранить файл настроек, вам, вероятно, следует использовать NSUserDefaults или CFPreferences , вместо того, чтобы обрабатывать списки самостоятельно.
  • Если у вас есть какая-то другая причина для сохранения файла, специфичного для пользователя, он обычно должен идти либо в папку chewable items, папка Caches или папка Preferences.Две функции, с которыми я связан, - это самый простой способ доступа к этим двум из этих трех папок;более сложный путь, и единственный, который работает на всех трех, это функция FSFindFolder .В отличие от большинства менеджеров папок, FSFindFolder не устарела и доступна в 64-разрядной версии.

Обновления 2012 года

  • В настоящее время выследует использовать URL, а не пути. NSFileManager имеет метод для получения URL-адреса нужного каталога.
  • Сшивание путей (или URL-адресов файлов) вместе не работает в изолированном приложении, поскольку у вас нет прав доступапуть, который вы только что выбрали.Вам необходимо получить путь (или URL-адрес) из системного API, будь то NSFileManager, NSSavePanel или что-то еще.
  • Для сохранения и восстановления ссылок на файлы используйте функцию закладок NSURL в области безопасности.
  • NSUserDefaults и CFPreferences работают должным образом в песочнице.
  • Диспетчер папок теперь полностью устарел по состоянию на 10.8.
  • Опрос домашней папки пользователя по-прежнему плохой манер.*
2 голосов
/ 17 марта 2010

Автоматическое расширение - это особенность оболочки.

Если вы используете Cocoa / Foundation, вы можете использовать методы NSString

- (NSString *)stringByAbbreviatingWithTildeInPath;
- (NSString *)stringByExpandingTildeInPath;

в противном случае вам придется самостоятельно написать код для этого. Получение имени пользователя для входа в систему и создание пути / Users / имя-логина / - это , а не правильный способ сделать это. (Хотя у большинства пользователей здесь есть свой домашний каталог, у некоторых его нет.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...