2014-10-22 119 views
0

我正在Objective-C中開發一個應用程序。用戶選擇一個目錄(使用NSOpenPanel),然後在應用程序中顯示該目錄中的文件列表。這工作沒有問題。如何獲取os x目錄中的文件列表?

但是,如果應用程序是重新開放,沒有通過NSOpenPanel選擇一個目錄,只是想在過去的啓動錯誤選擇的目錄中的文件列表出現

NSCocoaErrorDomain代碼= 257

我懷疑,如果用戶通過NSOpenPanel手動選擇的目錄中,該系統以某種方式記住它,並給這個目錄讀取訪問和獲取她的文件(使用方法contentsOfDirectoryAtPath),如果用戶沒有通過0選擇目錄並嘗試獲取其文件列表中的錯誤生成訪問權限。

這怎麼可能在這種情況下?

+1

如果您的應用程序是沙盒,那麼您必須保存書籤,而不僅僅是目錄名稱。請參閱[有關安全範圍書籤的文檔](https://developer.apple.com/library/mac/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3 -SW16) – Petesh 2014-10-22 10:38:03

回答

1

如果您的應用沙盒,你想訪問運行之間的文件/目錄,那麼你需要一個安全範圍的書籤存放的目錄,而不是目錄本身。

這意味着您需要將設置爲YES的布爾值屬性com.apple.security.files.bookmarks.app-scope添加到應用程序的權限以及com.apple.security.files.user-selected.read-write以允許選擇文件。

當您選擇的目錄,你需要做一個書籤吧:

NSOpenPanel *panel = [[NSOpenPanel alloc] init]; 
panel.canChooseDirectories = YES; 
NSInteger ret = [panel runModal]; 
if (ret == NSFileHandlingPanelOKButton) { 
    NSURL *anUrl = [[panel URLs] lastObject]; 
    NSError *err; 
    NSData *data = [anUrl bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope 
        includingResourceValuesForKeys:nil 
            relativeToURL:nil 
              error:&err]; 
    if (!data) { 
     NSLog(@"%@", err); 
     return NO; 
    } 

現在你已經得到了書籤,你需要堅持例如它這樣做:

NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; 
    [def setObject:data forKey:@"bookmark"]; 
    [def synchronize]; 

在應用程序的重新啓動,你需要的書籤從NSData轉換回一個網址,這是從實踐中來完成:

BOOL stale = NO; 
NSError *anError; 
NSURL *url = [NSURL URLByResolvingBookmarkData:data 
             options:NSURLBookmarkResolutionWithSecurityScope 
           relativeToURL:nil 
          bookmarkDataIsStale:&stale 
             error:&anError]; 
if (url && !stale) { 
    [anURL startAccessingSecurityScopedResource]; 
    // Do something with URL 
    [anURL stopAccessingSecurityScopedResource]; 
} else if (anError) { 
    NSLog(@"%@", anError); 
    return NO; 
} 

,如果你已經使用了默認的持久性的書籤數據,您可以使用:

NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; 
NSData *data = [def objectForKey:@"bookmark"]; 

從userdefaults恢復書籤數據。

+0

非常感謝! – 2014-10-23 08:25:54

相關問題