前言:
處於安全考慮,iOS系統的沙盒機制規定每個應用都只能訪問當前沙盒目錄下面的文件(也有例外,比如在用戶授權情況下訪問通訊錄,相冊等),這個規則展示了iOS系統的封閉性。在開發中常常需要數據存儲的功能,比如存取文件,歸檔解檔等。
一、沙盒目錄結構
每個APP的沙盒下面都有相似目錄結構,如圖(蘋果官方文檔):


NSString *path = NSHomeDirectory();
上面的代碼得到的是應用程序目錄的路徑,在該目錄下有三個文件夾:Documents、Library、temp以及一個.app包!該目錄下就是應用程序的沙盒,應用程序只能訪問該目錄下的文件夾!!!
1、Documents 目錄:您應該將所有的應用程序數據文件寫入到這個目錄下。這個目錄用於存儲用戶數據。該路徑可通過配置實現iTunes共享文件。可被iTunes備份。
2、AppName.app 目錄:這是應用程序的程序包目錄,包含應用程序的本身。由於應用程序必須經過簽名,所以您在運行時不能對這個目錄中的內容進行修改,否則可能會使應用程序無法啟動。
3、Library 目錄:這個目錄下有兩個子目錄:
Preferences 目錄:包含應用程序的偏好設置文件。您不應該直接創建偏好設置文件,而是應該使用NSUserDefaults類來取得和設置應用程序的偏好.
Caches 目錄:用於存放應用程序專用的支持文件,保存應用程序再次啟動過程中需要的信息。
可創建子文件夾。可以用來放置您希望被備份但不希望被用戶看到的數據。該路徑下的文件夾,除Caches以外,都會被iTunes備份。
4、tmp 目錄:這個目錄用於存放臨時文件,保存應用程序再次啟動過程中不需要的信息。該路徑下的文件不會被iTunes備份。
二、獲取各種文件目錄的路徑
獲取目錄路徑的方法:
// 獲取沙盒主目錄路徑 NSString *homeDir = NSHomeDirectory(); // 獲取Documents目錄路徑 NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; // 獲取Library的目錄路徑 NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; // 獲取Caches目錄路徑 NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; // 獲取tmp目錄路徑 NSString *tmpDir = NSTemporaryDirectory();
獲取應用程序程序包中資源文件路徑的方法:
NSLog(@"%@",[[NSBundle mainBundle] bundlePath]); NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"]; UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
三、NSSearchPathForDirectoriesInDomains
NSSearchPathForDirectoriesInDomains方法用於查找目錄,返回指定范圍內的指定名稱的目錄的路徑集合。有三個參數:
directory NSSearchPathDirectory類型的enum值,表明我們要搜索的目錄名稱,比如這里用NSDocumentDirectory表明我們要搜索的是Documents目錄。如果我們將其換成NSCachesDirectory就表示我們搜索的是Library/Caches目錄。
domainMask NSSearchPathDomainMask類型的enum值,指定搜索范圍,這里的NSUserDomainMask表示搜索的范圍限制於當前應用的沙盒目錄。還可以寫成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等。
expandTilde BOOL值,表示是否展開波浪線~。我們知道在iOS中~的全寫形式是/User/userName,該值為YES即表示寫成全寫形式,為NO就表示直接寫成“~”。
該值為NO:Caches目錄路徑~/Library/Caches
該值為YES:Caches目錄路徑
/var/mobile/Containers/Data/Application/E7B438D4-0AB3-49D0-9C2C-B84AF67C752B/Library/Caches