IOS中的沙盒機(jī)制(SandBox)是一種安全體系冰寻,它規(guī)定了應(yīng)用程序只能在為該應(yīng)用創(chuàng)建的文件夾內(nèi)讀取文件吴叶,不可以訪問其他地方的內(nèi)容望迎。所有的非代碼文件都保存在這個(gè)地方成榜,比如圖片席爽、聲音意荤、屬性列表和文本文件等。
每個(gè)應(yīng)用程序的沙盒分為三個(gè)部分只锻。分別是Documents(文件文檔) Library (資源)其中Library中又分為Caches(緩存)和Preferences(用戶信息)tmp(臨時(shí)文件)玖像。
下面我們快來說說這幾個(gè)文件都是干什么用的。Doucments是程序中創(chuàng)建的或在程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下齐饮。例如用戶在使用該軟件是下載的一些文件圖片視頻和音頻文件都存放在該目錄下捐寥,Tunes備份和恢復(fù)的時(shí)候會(huì)包括此目錄笤昨。Cashes存放緩存文件,比如瀏覽一些網(wǎng)站和觀看視頻和播放音樂都會(huì)生成緩存文件都會(huì)存放在這里握恳,iTunes不會(huì)備份此目錄瞒窒。Preferences 保存用戶的一些用戶設(shè)置信息,是用戶設(shè)置的一些信息乡洼。tmp存放臨時(shí)文件崇裁。當(dāng)我們下載文件時(shí)會(huì)臨時(shí)生成一個(gè)文件叫做臨時(shí)文件,該臨時(shí)文件就存放在這個(gè)文件夾里束昵。下圖就是一個(gè)應(yīng)用程序的沙盒文件:
下面我們介紹一下怎么用代碼來獲取沙盒路徑
FOUNDATION_EXPORT NSString *NSHomeDirectory(void);
FOUNDATION_EXPORT NSString *NSTemporaryDirectory(void);
這兩個(gè)都是系統(tǒng)提供快捷獲取到對(duì)應(yīng)目錄的 C 函數(shù)拔稳。分別是獲取應(yīng)用程序的Docunments目錄和tmp目錄。
除了這個(gè)系統(tǒng)提供了獲取目錄的文件夾的方法锹雏。
FOUNDATION_EXPORT NSArray<NSString *> *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);
這個(gè)方法有三個(gè)參數(shù)壳炎。
第一個(gè)參數(shù)是要訪問的目錄名。是一個(gè)枚舉逼侦∧浔纾可以點(diǎn)進(jìn)去看看都有哪些值。例 NSDocumentDirectory 獲取documents的路徑榛丢。
參數(shù)2:在用戶作用與下搜索 NSUserDomainMask
參數(shù)3: yes or no yes代表絕對(duì)路徑(基本上都用絕對(duì))铲球, no代表相對(duì)路徑。(應(yīng)為iOS的沙盒路徑是不斷變化得)晰赞。
返回的是一個(gè)數(shù)組稼病。
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSLog(@"%@", [pathArray firstObject]);
通過這兩行代碼我們就能訪問一個(gè)應(yīng)用程序的Documents的文件目錄。
二掖鱼, 文件的讀寫
<1> 字符串的讀寫
// 1> 將文字寫入本地
NSString *helloString = @"hello, I/O File";
// 一般拼接路徑時(shí)然走, 使用 stringByAppendingPathComponent
NSString *writePath = [[pathArray firstObject] stringByAppendingString:@"/hello.txt"];
NSString *writePath1 = [[pathArray firstObject] stringByAppendingPathComponent:@"hello.txt"];
NSError *error = nil;
BOOL isSuccess = [helloString writeToFile:writePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (error) {
NSLog(@"存儲(chǔ)失敗");
} else {
NSLog(@"恭喜存儲(chǔ)成功!");
}
//2 》 讀取對(duì)應(yīng)得文字
NSError *readaError = nil;
NSString *readString = [NSString stringWithContentsOfFile:writePath encoding:NSUTF8StringEncoding error:&readaError];
NSLog(@"%@", readString);
<2> 數(shù)組的讀寫
// 3> 將數(shù)組 寫入本地文件
NSArray *array = @[@"韓旭",@"王煌",@"報(bào)名里",@"國寶"];
NSString *arrayPath = [[pathArray firstObject] stringByAppendingPathComponent:@"name.plist"];
BOOL isArrayWriteSuccess = [array writeToFile:arrayPath atomically:YES];
if (isArrayWriteSuccess) {
NSLog(@"恭喜存儲(chǔ)成功戏挡!");
} else {
NSLog(@"存儲(chǔ)失敗");
}
//4> 將數(shù)組讀入
NSArray *nameArray = [NSArray arrayWithContentsOfFile:arrayPath];
NSLog(@"%@", nameArray);
<3> 字典的讀寫
//5> 字典 寫入本地
NSDictionary *nameDic = @{@"name":@"hello"};
NSString *dictionaryPath = [[pathArray firstObject] stringByAppendingPathComponent:@"nameDic.plist"];
BOOL isDicWriteSuccess = [nameDic writeToFile:dictionaryPath atomically:YES];
if (isDicWriteSuccess) {
NSLog(@"恭喜存儲(chǔ)成功芍瑞!");
} else {
NSLog(@"存儲(chǔ)失敗");
}
//6》 將字典 讀入
NSDictionary *nameDictionary = [NSDictionary dictionaryWithContentsOfFile:dictionaryPath];
NSLog(@"%@", nameDictionary);
<4> data數(shù)據(jù)的讀寫
// 7》 將Data 類型寫入本地
UIImage *image = [UIImage imageNamed:@"welcome_2"];
NSData *imageData = UIImageJPEGRepresentation(image, 1);
UIImagePNGRepresentation(image);
NSLog(@"%@", imageData);
NSString *dataPath = [[pathArray firstObject] stringByAppendingPathComponent:@"imageData"];
BOOL isimageDataWriteSuccess = [imageData writeToFile:dataPath atomically:YES];
if (isimageDataWriteSuccess) {
NSLog(@"恭喜存儲(chǔ)成功!");
} else {
NSLog(@"存儲(chǔ)失敗");
}
//8> NSData 類型 讀入
NSData *imageNewData = [NSData dataWithContentsOfFile:dataPath];
UIImage *fileImage =[UIImage imageWithData:imageNewData];