每個iOS應(yīng)用SDK都被限制在“沙盒”中,“沙盒”相當(dāng)于一個加了僅主人可見權(quán)限的文件夾,蘋果對沙盒有以下幾條限制。
1、應(yīng)用程序可以在自己的沙盒里運作,但是不能訪問任何其他應(yīng)用程序的沙盒。
2、應(yīng)用程序間不能共享數(shù)據(jù),沙盒里的文件不能被復(fù)制到其他應(yīng)用程序文件夾中,也不能把其他應(yīng)用程序文件夾中的文件復(fù)制到沙盒里。
3、蘋果禁止任何讀、寫沙盒以外的文件,禁止應(yīng)用程序?qū)?nèi)容寫到沙盒以外的文件夾中。
4、沙盒根目錄里有三個文件夾:Documents,一般應(yīng)該把應(yīng)用程序的數(shù)據(jù)文件存到這個文件夾里,用于存儲用戶數(shù)據(jù)或其他應(yīng)該定期備份的信息。Library,下有兩個文件夾,Caches存儲應(yīng)用程序再次啟動所需的信息,Preferences包含應(yīng)用程序偏好設(shè)置文件,不過不要在這里修改偏好設(shè)置。temp,存放臨時文件,即應(yīng)用程序再次啟動不需要的文件。
沙盒根目錄里有三個文件夾分別是:documents,tmp,Library。
1、Documents 目錄:您應(yīng)該將所有de應(yīng)用程序數(shù)據(jù)文件寫入到這個目錄下。這個目錄用于存儲用戶數(shù)據(jù)或其它應(yīng)該定期備份的信息。
2、AppName.app 目錄:這是應(yīng)用程序的程序包目錄,包含應(yīng)用程序的本身。由于應(yīng)用程序必須經(jīng)過簽名,所以您在運行時不能對這個目錄中的內(nèi)容進(jìn)行修改,否則可能會使應(yīng)用程序無法啟動。
3、Library 目錄:這個目錄下有兩個子目錄:Caches 和 Preferences
Preferences 目錄:包含應(yīng)用程序的偏好設(shè)置文件。您不應(yīng)該直接創(chuàng)建偏好設(shè)置文件,而是應(yīng)該使用NSUserDefaults類來取得和設(shè)置應(yīng)用程序的偏好.
Caches 目錄:用于存放應(yīng)用程序?qū)S玫闹С治募4鎽?yīng)用程序再次啟動過程中需要的信息。
4、tmp 目錄:這個目錄用于存放臨時文件,保存應(yīng)用程序再次啟動過程中不需要的信息。
iOS沙盒(sandbox)中的幾個目錄獲取方式:
//?獲取沙盒主目錄路徑
NSString?*homeDir?=?NSHomeDirectory();
//?獲取Documents目錄路徑
NSArray?*paths?=?NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,?YES);
NSString?*docDir?=?[paths?objectAtIndex:0];
//?獲取Caches目錄路徑
NSArray?*paths?=?NSSearchPathForDirectoriesInDomains(NSCachesDirectory,?NSUserDomainMask,?YES);
NSString?*cachesDir?=?[paths?objectAtIndex:0];
//?獲取tmp目錄路徑
NSString?*tmpDir?=??NSTemporaryDirectory();
//?獲取當(dāng)前程序包中一個圖片資源(apple.png)路徑
NSString?*imagePath?=?[[NSBundle?mainBundle]?pathForResource:@"apple"?ofType:@"png"];
UIImage?*appleImage?=?[[UIImage?alloc]?initWithContentsOfFile:imagePath];
例子:
NSFileManager* fm=[NSFileManager defaultManager];
if(![fm fileExistsAtPath:[self dataFilePath]]){
//下面是對該文件進(jìn)行制定路徑的保存
[fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];
//取得一個目錄下得所有文件名
NSArray *files = [fm subpathsAtPath: [self dataFilePath] ];
//讀取某個文件
NSData *data = [fm contentsAtPath:[self dataFilePath]];
//或者
NSData *data = [NSData dataWithContentOfPath:[self dataFilePath]];
}