每個iOS 應(yīng)用都有自己的沙盒路徑师抄,應(yīng)用沙盒就是文件系統(tǒng)目錄亿卤,與其他應(yīng)用的文件系統(tǒng)隔離,iOS應(yīng)用不允許訪問其他應(yīng)用的沙盒路徑项棠,但在iOS 8中已經(jīng)開發(fā)訪問柄延。
應(yīng)用沙盒一般包括以下幾個文件目錄:應(yīng)用程序包蚀浆、Document、Library(下面有Caches和Preferences )搜吧、tmp文件
應(yīng)用程序包:包含所有的資源文件和可執(zhí)行文件
Document:保存應(yīng)用運行時生成的需要持久化的數(shù)據(jù)市俊,iTunes會自動備份該目錄,蘋果建議將程序中建立的或在程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下滤奈,iTunes備份和恢復(fù)的時候會包括此目錄摆昧。
tmp:保存應(yīng)用運行時所需的臨時數(shù)據(jù),使用完畢后再將相應(yīng)的文件從該目錄刪除蜒程。應(yīng)用沒有運行時绅你,系統(tǒng)也有可能會清除該目錄下的文件,iTunes不會同步該目錄昭躺,iPhone重啟時忌锯,該目錄下的文件會丟失。
Library:存儲程序的默認(rèn)設(shè)置和其他狀態(tài)信息窍仰,iTunes會自動備份該目錄汉规。
Library/Caches:存放緩存文件,iTunes不會備份此目錄驹吮,此目錄下文件不會在應(yīng)用退出刪除针史。一般存放體積比較大,不是特別重要的資源碟狞。
Library/Preferences:保存應(yīng)用的所有偏好設(shè)置啄枕,iOS的Settings(設(shè)置)應(yīng)用會在該目錄中查找應(yīng)用的設(shè)置信息,iTunes會自動備份該目錄族沃。
沙盒文件目錄獲取代碼:
//Home目錄 NSString *homeDirectory = NSHomeDirectory();
//Document目錄NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)
NSString *path = [paths objectAtIndex:0];
//Cache目錄NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
NSString *path = [path objectAtIndex:0];
//Libaray目錄NSArray?*paths?=?NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,?NSUserDomainMask,?YES);
NSString?*path?=?[paths?objectAtIndex:0];
//tmp目錄NSString?*tmpDir?=?NSTemporaryDirectory();
文件夾操作
創(chuàng)建文件夾:
沙盒文件夾操作使用系統(tǒng)Foundation框架下的NSFileManager文件操作類實現(xiàn)频祝。在沙盒中新建文件夾,需指定新建文件夾的絕對路徑脆淹,然后手動創(chuàng)建常空。并且要保證新建文件夾的上級路徑已經(jīng)存在,否則需要先創(chuàng)建上級文件夾路徑盖溺。文件夾的創(chuàng)建使用createDirectoryAtPath方法漓糙。
新建文件夾代碼:
if?([[NSFileManager?defaultManager]?fileExistsAtPath:createPath])//判斷createPath路徑文件夾是否已存在,此處createPath為需要新建的文件夾的絕對路徑
{
return?NO;
}
else
{
[[NSFileManager?defaultManager]?createDirectoryAtPath:createPath?withIntermediateDirectories:YES?attributes:nil?error:nil];//創(chuàng)建文件夾
return?YES;
}pS:如何保證新建文件夾的父親文件夾已經(jīng)存在烘嘱,ios的Foundation框架中的NSPathUtilities類中提供了一些操作路徑string的方法昆禽。
stringByDeletingLastPathComponent:去掉路徑中的最后一級成員
比如pp/ppp/pppp操作過后則為:pp/ppp
pathComponents:拆分路徑
比如pp/ppp/pppp執(zhí)行后得到一個NSArray數(shù)組蝗蛙,里面有三個元素為pp ppp pppp。
lastPathComponent:獲取路徑中的最后一級文件名
相關(guān)方法還有很多醉鳖,可參考NSPathUtilities類捡硅。
刪除文件夾:
刪除文件夾,需先判定該文件夾是否存在(使用fileExistsAtPath方法)盗棵,如果存在壮韭,執(zhí)行刪除操作(使用removeItemAtPath)。
刪除文件夾代碼:
if([[NSFileManager?defaultManager] fileExistsAtPath:pathFull])//如果存在臨時文件的配置文件
{
[[NSFileManager?defaultManager] ?removeItemAtPath:pathFull error:&error];
}
移動文件夾:
文件夾移動需要兩個參數(shù)漾根,文件夾原絕對路徑與目標(biāo)絕對路徑泰涂。使用moveItemAtPath方法實現(xiàn)
移動文件夾代碼:
if([fileManager?moveItemAtPath:prePath?toPath:cenPath?error:&error]!=YES)// prePath為原路徑、cenPath為目標(biāo)路徑
{
NSLog(@"移動文件失敗");
}
else
{
NSLog(@"移動文件成功");
}
PS:文件夾移動需要注意的是辐怕,要確保目標(biāo)路徑中除了目標(biāo)文件夾之外的路徑確實存在逼蒙。否則移動到一個還沒有創(chuàng)建的文件夾下,是會失敗的寄疏,這和創(chuàng)建文件夾是一樣的是牢。
重命名文件夾:
重命名文件夾也需要兩個參數(shù),原絕對路徑與目標(biāo)絕對路徑陕截,用了一個偷換概念的方式來實現(xiàn)驳棱,其實用的是移動文件夾的方法。不贅述农曲。
獲取目錄下的所有文件名稱(包括文件夾與文件):
NSArray *fileNameList=[[NSFileManager defaultManager] contentsOfDirectoryAtPath:imagesFolder error:nil];// fileNameList中即為該imagesFolder文件夾下的所有文件的名稱數(shù)組
文件操作:
寫入文件:
寫入文件需要首先判定該文件的父親文件夾是否存在社搅,存在則可以進(jìn)行寫入,否則需首先創(chuàng)建父親
路徑乳规。使用writeToFile方法形葬。寫入文件的同時,系統(tǒng)會自動創(chuàng)建文件暮的。
一般數(shù)據(jù)類型笙以,比如數(shù)組、字典冻辩、NSData猖腕、NSString都可以直接調(diào)用writeToFile方法寫入文件。
代碼:[arrayA?writeToFile:filePath?atomically:YES];
也可以手動創(chuàng)建文件:
[fileManager?createFileAtPath:destinationPath?contents:[string dataUsingEncoding:NSUTF8StringEncoding]?attributes:nil]
讀取文件:
如果用戶知道文件內(nèi)容的數(shù)據(jù)類型比較規(guī)整恨闪,則可以直接讀取文件內(nèi)容到標(biāo)準(zhǔn)數(shù)據(jù)結(jié)構(gòu)中倘感。
NSArray?*arrayA?=?[[NSArray?alloc]initWithContentsOfFile:filePath];