我開發的Mac OS X 10.7沙盒應用程序,我想實現文件類似NSDocument
的方式節省:非就地保存在OS X沙盒
- 重寫文件的新內容到一個臨時文件
- 覆蓋原來的文件,臨時文件
我遇到的問題是,沙箱否認步驟2中我看到控制檯下面一行:
sandboxd: XXXX deny file-write-create /Volumes/Home/sbooth/Test Files/Test
我已經打開此文件進行讀取和寫入,並且啓用了文件系統讀取/寫入訪問權限。我知道NSDocument沒有特殊的權利,所以我試圖弄清楚我錯過了什麼。
這裏是我現在做的事情(應用程序的這一部分是在C++中,不客觀的,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
的代碼工作正常,如果我禁用沙盒。
編輯:附加信息是由費米要求。我使用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>
另外值得一提的是,蘋果在他們App Sandbox Design Guide,上面寫着:
If you are managing documents using any technology other than the NSDocument class, you must convert to using this class. The NSDocument class automatically works with Powerbox. NSDocument also provides support for keeping documents within your sandbox if the user moves them using Finder.
除了在控制檯sandboxd線,是'FSCopyObjectSync'返回一個錯誤? –
它確實會返回一個錯誤:-54 | permErr – sbooth
這也並不令人意外,但FSMoveObjectSync表現出相同的行爲 – sbooth