2012-10-22 12 views
2

在OS X中:在OS X中的POSIX API是否需要比可可更多的權限

我使用Cocoa API在用戶的桌面上創建一個目錄,它工作正常。 但是,如果我使用POSIX功能

int mkdir(const char *path, mode_t mode); 

創建用戶的桌面目錄,它總是失敗,返回-1。 但我在應用程序域目錄中測試了mkdir(),它工作正常。 那麼,當我在OS X中調用非Cocoa API時,是否需要更多權限?

要解釋爲什麼我需要調用POSIX API:

我想創建一個屬性一些特殊的目錄,我搜索使用setxattr(),這將增加所有我想要的屬性,但我可以」 t找到Cocoa方式使用setxattr(),Cocoa API中是否有對應的類,方法或函數?

+0

它返回'-1',並設置''errno' ==''EPERM'。你是沙盒嗎? mkdir調用perror(「error」)後的 – Petesh

+0

;並檢查錯誤 –

+0

@ParagBafna錯誤是2,ENOENT沒有這樣的文件或目錄,這很奇怪... – Loki

回答

0

我有一篇關於使用startAccessingSecurityScopedResource的好文章,但基於評論,看起來問題是請求的目錄不正確。

當需求出現時,您可以輕鬆地在Cocoa風格和POSIX API之間進行交換。當你需要的時候,這樣做應該沒有真正的問題。您應始終使用[NSFileManager defaultManager]URLsForDirectory方法來獲取用戶特定的目錄,因爲它們可能與您期望的不同。

你應該使用一個類似於:

NSString *desktopDir = nil; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSArray *urls = [fileManager URLsForDirectory:NSDesktopDirectory inDomains:NSUserDomainMask]; 

if ([urls count] > 0) { 
    NSURL *desktopURL = [urls objectAtIndex:0]; 
    NSLog(@"%@", desktopURL); 
    desktopDir = desktopURL.path; 
} 
if (desktopDir != nil) { 
    NSString *xx = [desktopDir stringByAppendingPathComponent:@"/XXX"]; 
    mkdir(xx.UTF8String, 0755); 
} 
+0

上帝,它調用文件的URL需要「文件:/ /」 – Loki

+0

它使用本地URL代表文件/目錄,因爲它可以附加安全信息,當他們在沙盒中使用 – Petesh