每個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:存儲程序的默認設(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ù)組
文件操作:
寫入文件:
寫入文件需要首先判定該文件的父親文件夾是否存在,存在則可以進行寫入,否則需首先創(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];