iOS 關(guān)于文件操作 NSFileManager

參考鏈接:http://www.reibang.com/p/086ca6d2c5de

1.沙盒機(jī)制

處于安全考慮碎绎,iOS系統(tǒng)的沙盒機(jī)制規(guī)定每個(gè)應(yīng)用都只能訪問當(dāng)前沙盒目錄下面的文件(也有例外泊柬,比如在用戶授權(quán)情況下訪問通訊錄狭莱,相冊等)璧针,這個(gè)規(guī)則展示了iOS系統(tǒng)的封閉性虽画。在開發(fā)中常常需要數(shù)據(jù)存儲(chǔ)的功能婚肆,比如存取文件驳阎,歸檔解檔等脑豹。

每一個(gè)iOS應(yīng)用程序都會(huì)為自己創(chuàng)建一個(gè)文件系統(tǒng)目錄郑藏,這個(gè)獨(dú)立、封閉瘩欺、安全的空間叫做沙盒必盖。沙盒就是一種安全體系,它規(guī)定了應(yīng)用程序只能在自己的文件系統(tǒng)目錄內(nèi)訪問文件,不可以訪問其他應(yīng)用沙盒內(nèi)的內(nèi)容。所有的非代碼文件都保存在這個(gè)地方凯正。

沙盒根目錄結(jié)構(gòu):Documents、Library阁吝、temp

沙盒目錄

Documents

保存應(yīng)用運(yùn)行時(shí)生成的需要持久化的數(shù)據(jù),iTunes備份和恢復(fù)的時(shí)候會(huì)包括此目錄械拍,所以蘋果建議將程序中建立的或在程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下突勇。

Library

Caches:存放緩存文件,iTunes不會(huì)備份此目錄坷虑,此目錄下文件不會(huì)在應(yīng)用退出后刪除 甲馋。一般存放體積比較大,不是特別重要的資源迄损。

Preferences:保存APP的所有偏好設(shè)置定躏,iOS的Settings(設(shè)置)應(yīng)用會(huì)在該目錄中查找應(yīng)用的設(shè)置信息,iTunes會(huì)自動(dòng)備份該目錄。注意:通過NSUserDefaults類來讀取和設(shè)置痊远。

tmp

保存應(yīng)用運(yùn)行時(shí)所需的臨時(shí)數(shù)據(jù)垮抗,這個(gè)可以放一些當(dāng)APP退出后不再需要的文件。應(yīng)用沒有運(yùn)行時(shí)碧聪,系統(tǒng)也有可能會(huì)清除該目錄下的文件冒版,iTunes不會(huì)同步該目錄。iPhone重啟時(shí)逞姿,該目錄下的文件會(huì)被刪除辞嗡。

如何查看該目錄?

XCode->Window->Devices->真機(jī)->Installed Apps->應(yīng)用->ShowContainer

沙盒目錄

也可以點(diǎn)擊DownloadContainer下載該沙盒文件查看內(nèi)容

沙盒內(nèi)容

獲取相關(guān)目錄

// 獲取Document目錄NSString*docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];// 獲取Library目錄NSString*LibraryPath=[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES)lastObject];// 獲取Caches目錄NSString*cachesPath=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)lastObject];// 獲取Preferences目錄 通常情況下滞造,Preferences有系統(tǒng)維護(hù)续室,所以我們很少去操作它。NSString*preferPath=[LibraryPath stringByAppendingPathComponent:@"Preferences"];// 獲取tmp目錄NSString*tmpPath=NSTemporaryDirectory();

說明:

三谒养、NSSearchPathForDirectoriesInDomains

NSSearchPathForDirectoriesInDomains方法用于查找目錄挺狰,返回指定范圍內(nèi)的指定名稱的目錄的路徑集合。有三個(gè)參數(shù):

**directory** NSSearchPathDirectory類型的enum值买窟,表明我們要搜索的目錄名稱她渴,比如這里用NSDocumentDirectory表明我們要搜索的是Documents目錄。如果我們將其換成NSCachesDirectory就表示我們搜索的是Library/Caches目錄蔑祟。

** * domainMask* ** NSSearchPathDomainMask類型的enum值,指定搜索范圍沉唠,這里的NSUserDomainMask表示搜索的范圍限制于當(dāng)前應(yīng)用的沙盒目錄疆虚。還可以寫成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等满葛。

** * expandTilde* ** BOOL值径簿,表示是否展開波浪線。我們知道在iOS中的全寫形式是/User/userName嘀韧,該值為YES即表示寫成全寫形式篇亭,為NO就表示直接寫成“~”。

該值為NO:Caches目錄路徑~/Library/Caches

該值為YES:Caches目錄路徑

/var/mobile/Containers/Data/Application/E7B438D4-0AB3-49D0-9C2C-B84AF67C752B/Library/Caches

[toc]

相關(guān)文件操作

--

創(chuàng)建文件夾

+(BOOL)creatDir:(NSString*)path{if(path.length==0){returnNO;}NSFileManager*fileManager=[NSFileManager defaultManager];BOOL isSuccess=YES;BOOL isExist=[fileManager fileExistsAtPath:path];if(isExist==NO){NSError*error;if(![fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error]){isSuccess=NO;NSLog(@"creat Directory Failed:%@",[error localizedDescription]);}}returnisSuccess;}

創(chuàng)建文件

+(BOOL)creatFile:(NSString*)filePath{if(filePath.length==0){returnNO;}NSFileManager*fileManager=[NSFileManager defaultManager];if([fileManager fileExistsAtPath:filePath]){returnYES;}NSError*error;NSString*dirPath=[filePath stringByDeletingLastPathComponent];BOOL isSuccess=[fileManager createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:&error];if(error){NSLog(@"creat File Failed:%@",[error localizedDescription]);}if(!isSuccess){returnisSuccess;}isSuccess=[fileManager createFileAtPath:filePath contents:nil attributes:nil];returnisSuccess;}

寫數(shù)據(jù)

+(BOOL)writeToFile:(NSString*)filePath contents:(NSData*)data{if(filePath.length==0){returnNO;}BOOL result=[selfcreatFile:filePath];if(result){if([data writeToFile:filePath atomically:YES]){NSLog(@"write Success");}else{NSLog(@"write Failed");}}else{NSLog(@"write Failed");}returnresult;}

追加寫數(shù)據(jù)

+(BOOL)appendData:(NSData*)data withPath:(NSString*)filePath{if(filePath.length==0){returnNO;}BOOL result=[selfcreatFile:filePath];if(result){NSFileHandle*handle=[NSFileHandle fileHandleForWritingAtPath:filePath];[handle seekToEndOfFile];[handle writeData:data];[handle synchronizeFile];[handle closeFile];}else{NSLog(@"appendData Failed");}returnresult;}

讀文件數(shù)據(jù)

+(NSData*)readFileData:(NSString*)path{NSFileHandle*handle=[NSFileHandle fileHandleForReadingAtPath:path];NSData*fileData=[handle readDataToEndOfFile];[handle closeFile];returnfileData;}

獲取文件夾下所有的文件列表

+(NSArray*)getFileList:(NSString*)path{if(path.length==0){returnnil;}NSFileManager*fileManager=[NSFileManager defaultManager];NSError*error;NSArray*fileList=[fileManager contentsOfDirectoryAtPath:path error:&error];if(error){NSLog(@"getFileList Failed:%@",[error localizedDescription]);}returnfileList;}

獲取文件夾下所有文件(深度遍歷)

+(NSArray*)getAllFileList:(NSString*)path{if(path.length==0){returnnil;}NSArray*fileArray=[selfgetFileList:path];NSMutableArray*fileArrayNew=[NSMutableArray array];NSFileManager*fileManager=[NSFileManager defaultManager];for(NSString*aPathinfileArray){NSString*fullPath=[path stringByAppendingPathComponent:aPath];BOOL isDir=NO;if([fileManager fileExistsAtPath:fullPath isDirectory:&isDir]){if(isDir){[fileArrayNew addObjectsFromArray:[selfgetAllFileList:fullPath]];}else{[fileArrayNew addObject:fullPath];}}}returnfileArrayNew;}

移動(dòng)文件

+(BOOL)moveFile:(NSString*)fromPath toPath:(NSString*)toPath toPathIsDir:(BOOL)dir{NSFileManager*fileManager=[NSFileManager defaultManager];if(![fileManager fileExistsAtPath:fromPath]){NSLog(@"Error: fromPath Not Exist");returnNO;}BOOL isDir=NO;BOOL isExist=[fileManager fileExistsAtPath:toPath isDirectory:&isDir];if(isExist){if(isDir){if([selfcreatDir:toPath]){NSString*fileName=fromPath.lastPathComponent;toPath=[toPath stringByAppendingPathComponent:fileName];return[selfmoveItemAtPath:fromPath toPath:toPath];}}else{[selfremoveFile:toPath];return[selfmoveItemAtPath:fromPath toPath:toPath];}}else{if(dir){if([selfcreatDir:toPath]){NSString*fileName=fromPath.lastPathComponent;toPath=[toPath stringByAppendingPathComponent:fileName];return[selfmoveItemAtPath:fromPath toPath:toPath];}}else{return[selfmoveItemAtPath:fromPath toPath:toPath];}}returnNO;}+(BOOL)moveItemAtPath:(NSString*)fromPath toPath:(NSString*)toPath{BOOL result=NO;NSError*error=nil;NSFileManager*fileManager=[NSFileManager defaultManager];result=[fileManager moveItemAtPath:fromPath toPath:toPath error:&error];if(error){NSLog(@"moveFile Fileid:%@",[error localizedDescription]);}returnresult;}

刪除文件

+(BOOL)removeFile:(NSString*)filePath{BOOL isSuccess=NO;NSError*error;NSFileManager*fileManager=[NSFileManager defaultManager];isSuccess=[fileManager removeItemAtPath:filePath error:&error];if(error){NSLog(@"removeFile Field:%@",[error localizedDescription]);}else{NSLog(@"removeFile Success");}returnisSuccess;}

刪除文件夾

+(BOOL)removeDir:(NSString*)path{return[selfremoveFile:path];}

刪除某些后綴的文件

+(void)removeFileSuffixList:(NSArray<NSString*>*)suffixList filePath:(NSString*)path deep:(BOOL)deep{NSArray*fileArray=nil;if(deep){// 是否深度遍歷fileArray=[selfgetAllFileList:path];}else{fileArray=[selfgetFileList:path];NSMutableArray*fileArrayTmp=[NSMutableArray array];for(NSString*fileNameinfileArray){NSString*allPath=[path stringByAppendingPathComponent:fileName];[fileArrayTmp addObject:allPath];}fileArray=fileArrayTmp;}for(NSString*aPathinfileArray){for(NSString*suffixinsuffixList){if([aPath hasSuffix:suffix]){[selfremoveFile:aPath];}}}}

獲取文件大小

+(longlong)getFileSize:(NSString*)path{unsignedlonglongfileLength=0;NSNumber*fileSize;NSFileManager*fileManager=[NSFileManager defaultManager];NSDictionary*fileAttributes=[fileManager attributesOfItemAtPath:path error:nil];if((fileSize=[fileAttributes objectForKey:NSFileSize])){fileLength=[fileSize unsignedLongLongValue];//單位是 B}returnfileLength;}

獲取文件的信息(包含了上面文件大小)

+(NSDictionary*)getFileInfo:(NSString*)path{NSError*error;NSDictionary*reslut=[[NSFileManager defaultManager]attributesOfItemAtPath:path error:&error];if(error){NSLog(@"getFileInfo Failed:%@",[error localizedDescription]);}returnreslut;}

[toc]

NSFileManager和NSFileHandle

1锄贷、NSFileManager(文件管理對(duì)象)

主要是對(duì)文件進(jìn)行的操作(創(chuàng)建/刪除/改名等)以及文件信息的獲取译蒂。

方法說明

@property (class, readonly, strong) NSFileManager *defaultManager創(chuàng)建文件管理對(duì)象

-(BOOL)fileExistsAtPath:(NSString *)path isDirectory:(nullable BOOL *)isDirectory判斷某個(gè)路徑是否存在,isDirectory是一個(gè)指針谊却,表示該路徑是否是目錄

-(BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(nullable NSDictionary<NSString *, id> *)attributes error:(NSError **)error創(chuàng)建一個(gè)目錄

-(BOOL)createFileAtPath:(NSString *)path contents:(nullable NSData *)data attributes:(nullable NSDictionary<NSString *, id> *)attr創(chuàng)建一個(gè)文件,可順便寫入data

-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFileNSData類型的寫入數(shù)據(jù),讀數(shù)據(jù)請(qǐng)自行查閱

-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)errorNSString柔昼、NSArray、NSDictionary的寫入數(shù)據(jù)炎辨,讀數(shù)據(jù)請(qǐng)自行查閱

-(nullable NSArray<NSString *> *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error獲取當(dāng)前文件夾下的文件/目錄

-(BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error移動(dòng)文件捕透,可用來重命名

-(BOOL)copyItemAtURL:(NSURL *)srcURL toURL:(NSURL *)dstURL error:(NSError **)error復(fù)制文件

-(BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error刪除文件

-(nullable NSDictionary<NSFileAttributeKey, id> *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error獲取文件信息(文件大小、修改時(shí)間、所有者等)

</b>

2乙嘀、NSFileHandle(文件連接器)

主要是對(duì)文件內(nèi)容進(jìn)行讀取和寫入操作

方法說明

+(nullable instancetype)fileHandleForWritingAtPath:(NSString *)path寫的方式打開文件

+(nullable instancetype)fileHandleForReadingAtPath:(NSString *)path讀的方式打開文件

-(unsigned long long)seekToEndOfFile跳到文件末尾

-(void)seekToFileOffset:(unsigned long long)offset跳到指定偏移位置

-(void)truncateFileAtOffset:(unsigned long long)offset將文件的長度設(shè)為offset字節(jié)

-(NSData *)readDataToEndOfFile從當(dāng)前字節(jié)讀取到文件到末尾數(shù)據(jù)

-(NSData *)readDataOfLength:(NSUInteger)length從當(dāng)前字節(jié)讀取到指定長度數(shù)據(jù)

-(void)synchronizeFile同步文件末购,通常用在寫入數(shù)據(jù)后

-(void)closeFile關(guān)閉文件

[toc]

對(duì)象等復(fù)雜類型的讀寫操作

上述數(shù)據(jù)操作,支持的類型僅僅是NSString虎谢、NSArray盟榴、NSDictionary、NSData類型嘉冒,這些都數(shù)據(jù)類型都支持了NSCoding協(xié)議曹货,可以進(jìn)行數(shù)據(jù)持久化。如果我們想存儲(chǔ)如UIImage讳推、自定義的對(duì)象等類型顶籽,我們都需要將其轉(zhuǎn)換為NSData類型,如轉(zhuǎn)換UIImage為NSData使用UIImagePNGRepresentation(image)等方法银觅,而自定義對(duì)象類型則需要進(jìn)行歸檔礼饱、反歸檔來進(jìn)行存取操作

存:

對(duì)象->歸檔->NSData->文件寫入

取:

文件讀取->NSData->反歸檔->對(duì)象

自定義對(duì)象需要遵守NSCoding協(xié)議并實(shí)現(xiàn)

-(void)encodeWithCoder:(NSCoder*)aCoder;//序列化 -(id)initWithCoder:(NSCoder*)aDecoder;//反序列化

兩個(gè)方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末究驴,一起剝皮案震驚了整個(gè)濱河市镊绪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洒忧,老刑警劉巖蝴韭,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異熙侍,居然都是意外死亡榄鉴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門蛉抓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庆尘,“玉大人,你說我怎么就攤上這事巷送∈患桑” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵笑跛,是天一觀的道長付魔。 經(jīng)常有香客問我,道長飞蹂,這世上最難降的妖魔是什么抒抬? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮晤柄,結(jié)果婚禮上擦剑,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好惠勒,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布赚抡。 她就那樣靜靜地躺著,像睡著了一般纠屋。 火紅的嫁衣襯著肌膚如雪涂臣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天售担,我揣著相機(jī)與錄音赁遗,去河邊找鬼。 笑死族铆,一個(gè)胖子當(dāng)著我的面吹牛岩四,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哥攘,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼剖煌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逝淹?” 一聲冷哼從身側(cè)響起耕姊,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎栅葡,沒想到半個(gè)月后茉兰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欣簇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年邦邦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醉蚁。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鬼店,靈堂內(nèi)的尸體忽然破棺而出网棍,到底是詐尸還是另有隱情,我是刑警寧澤妇智,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布滥玷,位于F島的核電站,受9級(jí)特大地震影響巍棱,放射性物質(zhì)發(fā)生泄漏惑畴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一航徙、第九天 我趴在偏房一處隱蔽的房頂上張望如贷。 院中可真熱鬧,春花似錦、人聲如沸杠袱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽楣富。三九已至凿掂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纹蝴,已是汗流浹背庄萎。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留塘安,地道東北人糠涛。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像耙旦,于是被迫代替她去往敵國和親脱羡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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

  • 原文出處 http://blog.csdn.net/feng2qing/article/details/54974...
    蕭溪閱讀 3,264評(píng)論 0 0
  • 一免都、iOS中的沙盒機(jī)制 iOS應(yīng)用程序只能對(duì)自己創(chuàng)建的文件系統(tǒng)讀取文件锉罐,這個(gè)獨(dú)立、封閉绕娘、安全的空間脓规,叫做沙盒。它一...
    絢雨藍(lán)了個(gè)楓閱讀 4,101評(píng)論 0 2
  • 一险领、iOS中的沙盒機(jī)制 iOS應(yīng)用程序只能對(duì)自己創(chuàng)建的文件系統(tǒng)讀取文件侨舆,這個(gè)獨(dú)立、封閉绢陌、安全的空間挨下,叫做沙盒。它一...
    1d5cb7cff98d閱讀 1,779評(píng)論 0 0
  • iOS開發(fā)-文件管理(一) 一脐湾、iOS中的沙盒機(jī)制 iOS應(yīng)用程序只能對(duì)自己創(chuàng)建的文件系統(tǒng)讀取文件臭笆,這個(gè)獨(dú)立、封閉...
    MacShare閱讀 1,804評(píng)論 0 6
  • 一秤掌、iOS中的沙盒機(jī)制 iOS應(yīng)用程序只能對(duì)自己創(chuàng)建的文件系統(tǒng)讀取文件愁铺,這個(gè)獨(dú)立、封閉闻鉴、安全的空間茵乱,叫做沙盒。它一...
    莫許閱讀 1,771評(píng)論 0 0