<OC的文件操作>
NSFileManager 文件管理器完成文件的創(chuàng)建、移動(dòng)、拷貝等管理操作
1.查詢文件和目錄
OC中查詢路徑下的目錄主要分為淺度遍歷和深度遍歷。
淺度遍歷
NSFileManager * manager = [NSFileManager defaultManager];//創(chuàng)建文件管理器,+方法
NSError * error = nil; //存數(shù)錯(cuò)誤信息
NSArray * array = [manager contentsOfDirectoryAtPath:@"/tmp" error:&error];
//查詢目錄“/tmp”下的文件和目錄,此函數(shù)返回值類型為NSArray *
這種查詢方法,只看一級目錄,只看所查目錄,不看子目錄
深度遍歷
NSArray * array = [manager subpathsOfDirectoryAtPath: @"/tmp" error: &error];
這種方法查看所查目錄和其所有子目錄下的文件
2.創(chuàng)建目錄
[manager createDirectoryAtPath:@"./1/2" withIntermediateDirectories:YES attributes:nil error:&error];
//第一個(gè)參數(shù)指目錄創(chuàng)建的位置,這里”./”,為當(dāng)前目錄,指程序所在目錄
//第二個(gè)參數(shù),是否創(chuàng)建中間目錄,意思為我們目的創(chuàng)建2目錄,若1無的話,先創(chuàng)建1,再創(chuàng)建2
//第三個(gè),指目錄的屬性,其權(quán)限等東西,我們可以設(shè)為nil暫時(shí)不考慮
3.創(chuàng)建文件
[manager createFileAtPath:@"./hello/world/1.txt" contents:nil attributes:nil];//創(chuàng)建一個(gè)名為1.txt的文件
//第二個(gè)參數(shù),指以什么內(nèi)容創(chuàng)建,nil為空文件
//第三個(gè)參數(shù),文件的亞屬性,我們這里不考慮,nil設(shè)置
//此函數(shù)返回值為BOOL型,YES創(chuàng)建成功,NO失敗
4.拷貝目錄或文件
[manager copyItemAtPath:@"./hello/world" toPath:@"./world" error:&error];
//拷貝目錄或文件,拷貝目錄時(shí),會把目錄下的文件和子目錄都拷走
//第二個(gè)參數(shù),必須寫上拷過來之后的重命名
//第一個(gè)參數(shù),必須是一個(gè)存在的目錄或文件,第二個(gè)參數(shù)必須是一個(gè)不存在的目錄或文件
//這程序表示,hello下的world拷貝到當(dāng)前目錄,改名為world
5.移動(dòng)/剪切目錄和文件
[manager moveItemAtPath:@"/tmp/dir1" toPath:@"./dir1" error:&error];//需注意的地方,與拷貝類似
6.刪除目錄和文件
[manager removeItemAtPath:@"./dir1" error:&error];//與移動(dòng)類似,只是沒有了目標(biāo)位置
7.判斷文件是否存在
[manager fileExistsAtPath:@"./1.txt"];//返回值為BOOL,YES為存在
NSFileHandle 文件句柄 文件的讀寫修改操作
對文件內(nèi)容進(jìn)行操作,我們需要一個(gè)新的類NSData來幫助我們。NSData可以創(chuàng)建一個(gè)用來存儲數(shù)據(jù)的對象,進(jìn)而我們對文件內(nèi)容進(jìn)行操作。
1.創(chuàng)建含有內(nèi)容的文件
NSString * str = @”Hello World”;
NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSFileManager * manager = [NSFileManager defaultManager];
[manager creatFileAtPath:@”./helloworld” contents:data attributes:nil];
//如果第二個(gè)參數(shù)不是nil,就會在創(chuàng)建文件的同時(shí),將data內(nèi)容寫入文件
2.添加內(nèi)容到已有的文件中
NSFileHandle * handle = [NSFileHandle fileHandleForWritingAtPath:@”./helloworld”]; //只寫方式打開
[handle writeData:data]; //寫入data數(shù)據(jù)
想要寫入的數(shù)據(jù),轉(zhuǎn)為data,再寫到文件中去。
handle = [NSFileHandle fileHandleForReading AtPath:@”./helloworld”];//只讀方式打開
handle = [NSFileHandle fileHandleForUpdating AtPath:@”./helloworld”];//以讀寫的方式打開
這面的三種方式,均能寫入文件內(nèi)容,但是我們會發(fā)現(xiàn),再次執(zhí)行后,都會覆蓋上次寫入的內(nèi)容。
3.追加內(nèi)容到文件
與C語言文件管理不同的是,OC中沒有追加的打開方式。OC中解決問題的方式,其實(shí)也很簡單,就是將文件指針移到文件尾,然后再執(zhí)行寫入data操作,這樣就能完成追加。
[handle seekToEndOfFile];//指針定位在文件尾,打開后執(zhí)行這一步,再寫入數(shù)據(jù),可完成追加。
4.讀取文件內(nèi)容
讀取文件內(nèi)容有很多種方式,每種方式根據(jù)不同需要,可起到很好的效果。
(1)不打開文件,直接讀取文件內(nèi)容
NSData * data = [NSData dataWithContentsOfFile:@”./1.txt”];
NSData對象data將保存一個(gè)普通的C字符串,我們使用data輸出時(shí),使用%s,輸出就能看到我們讀出的內(nèi)容。使用%@輸出的話,我們得到的是一串ASCII碼值。
NSLog(@”%@”,(char * )[data bytes]);//強(qiáng)轉(zhuǎn)一下再打印。
(2)打開文件,再讀取
NSFileHandle * handle = [NSFileHandle FileHandleForReadindAtPath:@”./1.txt”];
NSData * data = [handle readDataOfToEndOfFile];//讀到文件尾,data接收內(nèi)容
NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];//將data內(nèi)容轉(zhuǎn)入字符串
我們也可以實(shí)現(xiàn)文件的分段讀取,避免文件過大,內(nèi)存不夠的情況
[handle readDataOfLength:6];//讀取六個(gè)字符的內(nèi)容
配合循環(huán)可以讀取文件的全部內(nèi)容。
[handle seekToFileOfSet:0];//指針定位在文件頭
(2)直接讀取文件內(nèi)容到字符串
NSString * str = [NSString stringWithContentOfFile:@”./1.txt” encoding:NSUTF8StringEncoding error:&error];//以文件內(nèi)容生成一字符串,讀取全部內(nèi)容
[str writeToFile:@”./2.txt” atomically:no encoding:NSUTF8String Encoding error:&error];//將字符串內(nèi)容寫入到文件中