2016-12-20 73 views
0

從我的Mac OS應用程序中,我嘗試使用以下代碼來獲取應用程序當前目錄,以便在應用程序包路徑中生成日誌文件。在Mac App中獲取應用程序目錄路徑的正確方法

NSString *path = [[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent:@"TSPlogfile.txt"]; 

它工作得很好,當我從運行Xcode的應用程序,但發現[[NSFileManager defaultManager] currentDirectoryPath]回報只是/運行時從取景器applicationxxx.app

後來我解決了這個用[[[NSBundle mainBundle].bundlePath stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"TSPlogfile.txt"];

這個工作在兩種情況下,罰款(從Xcode和從取景器上運行的應用程序)

你能解釋一下爲什麼[[NSFileManager defaultManager] currentDirectoryPath],同時從取景器上運行的應用程序失敗?

回答

4

您不應將任何內容寫入應用程序所在的包或文件夾。如果你的應用程序是sandboxed,那麼你將無法做到。

使用「應用程序支持」文件夾中,而不是:

NSError *error; 
NSFileManager *manager = [NSFileManager defaultManager]; 
NSURL *applicationSupport = [manager URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:false error:&error]; 
NSString *identifier = [[NSBundle mainBundle] bundleIdentifier]; 
NSURL *folder = [applicationSupport URLByAppendingPathComponent:identifier]; 
[manager createDirectoryAtURL:folder withIntermediateDirectories:true attributes:nil error:&error]; 
NSURL *fileURL = [folder URLByAppendingPathComponent:@"TSPlogfile.txt"]; 

我已經使用NSURL實現以上,但如果使用路徑的概念同樣適用,太。

參見File System Programming Guide: OS X Library Directory Details

你問:

你能解釋一下爲什麼[[NSFileManager defaultManager] currentDirectoryPath],同時從取景器上運行的應用程序失敗?

您碰巧在Finder中查看的文件夾與運行應用程序時的「當前目錄」不同。簡而言之,「當前目錄」與應用程序的位置無關。

0

這是你如何能得到您的應用程序包所在的目錄:

NSURL *appFolder = [[[NSBundle mainBundle] bundleURL] URLByDeletingLastPathComponent]; 

這給你的路徑到應用程序文件夾(/應用程序和〜/應用)

NSArray *paths =[[NSFileManager defaultManager] URLsForDirectory:NSApplicationDirectory inDomains:NSLocalDomainMask]; 
相關問題