iOS 的沙盒路徑&文件操作

每個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];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容