Я разрабатываю изолированное приложение для Mac OS X 10.7 и пытаюсь реализовать сохранение файла способом, аналогичным NSDocument
:
- Переписать новое содержимое файла во временноеfile
- Перезаписать исходный файл временным файлом
У меня проблема в том, что песочница запрещает шаг 2. Я вижу в консоли следующую строку:
sandboxd: XXXX deny file-write-create /Volumes/Home/sbooth/Test Files/Test
У меня уже есть этот файл, открытый для чтения и записи, и у меня включено разрешение на чтение и запись для файловой системы.Я знаю, что NSDocument делает это без специальных прав, поэтому я пытаюсь выяснить, что я пропустил.
Вот как я сейчас делаю (эта часть приложения на C ++, а не Objective-C / C ++):
FSRef tempFileFSRef;
if(noErr != FSPathMakeRef((const UInt8 *)tempFileName, &tempFileFSRef, NULL))
; // Handle it
CFURLRef destinationDirURL = CFURLCreateCopyDeletingLastPathComponent(kCFAllocatorDefault, mURL);
FSRef destinationDirFSRef;
if(!CFURLGetFSRef(destinationDirURL, &destinationDirFSRef))
; // Handle it
CFRelease(destinationDirURL), destinationDirURL = NULL;
CFStringRef destinationName = CFURLCopyLastPathComponent(mURL);
FSRef target;
OSStatus result = FSCopyObjectSync(&tempFileFSRef, &destinationDirFSRef, destinationName, &target, kFSFileOperationOverwrite | kFSFileOperationSkipSourcePermissionErrors);
if(noErr != result)
; // Handle it
Код работает правильно, если я отключаю песочницу.
Редактировать: Femi запросила дополнительную информацию.Я открываю файл с помощью C stdio:
FILE *f = fopen(reinterpret_cast<const char *>(buf), "r");
и он закрывается с помощью fclose
до создания временного файла.
Мои права:
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.assets.music.read-write</key>
<true/>
<key>com.apple.security.files.downloads.read-write</key>
<true/>
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
</dict>
Стоит также отметить, что Apple в своем Руководстве по разработке изолированной программной среды приложения говорит, что:
Если вы управляете документами с использованием любой технологии, отличной от класса NSDocument, вы должны перейти на использование этойучебный класс.Класс NSDocument автоматически работает с Powerbox.NSDocument также поддерживает хранение документов в вашей песочнице, если пользователь перемещает их с помощью Finder.