NSFileHandle
利用 ?文件操作柄,也就是 ?NSFileHandle這類物件,我們 ?可以更加近距離地 ?操作 ?文件。一般來說,操作 ?文件 ?需要 ?下面三個(gè)步驟:
下面的表格 ?總結(jié)了 ?可以對文件操作柄所采取的措施:
| 措施名稱 | 描述 |
| +(NSFileHandle *)fileHandleForReadingAtPath:path | 打開文件以便讀取 |
| +(NSFileHandle *)fileHandleForWritingAtPath:path | 打開文件以便寫入 |
| +(NSFileHandle *)fileHandleForUpdatingAtPath:path | 打開文件以便讀寫 |
| -(NSData *)availableData | 產(chǎn)生的結(jié)果為其實(shí)施對象中可用的數(shù)據(jù) |
| -(NSData *)readDataToEndOfFile | 讀取文件末尾處之前的數(shù)據(jù) |
| -(NSData *)readDataOfLength:(NSUInteger)bytes | 讀取長度為bytes字節(jié)的數(shù)據(jù) |
| -(void)writeData:data | 將數(shù)據(jù)data寫入文件 |
| -(unsigned long long)offsetInFile | 獲取當(dāng)前文件中的操作位置 |
| -(void)seekToFileOffset:offset | 將當(dāng)前文件的操作位置設(shè)定為offset |
| -(unsigned long long)seekToEndOfFile | 將當(dāng)前文件的操作位置設(shè)定為文件的末尾處 |
| -(void)truncateFileAtOffset:offset | 將文件的長度設(shè)定為offset |
| -(void)closeFile | 關(guān)閉文件 |
你 ?應(yīng)該注意:利用 ?文件操作柄 ?并不能創(chuàng)建 ?文件。創(chuàng)建 ?文件 ?只能利用 ?文件管理器,也就是 ?NSFileManager這類物件。所以 ?向 ?NSFileHandle這類物件 ?發(fā)送 ?fileHandleForWritingAtPath: ?和 ?fileHandleForUpdatingAtPath:這兩條消息的前提 ?是 ?文件 ?必須存在,如果 ?文件 ?并不存在,那么 ?NSFileHandle這類物件 ?就會(huì)產(chǎn)生出 ?空值nil。在這兩種情況之下,文件的操作位置 ?都被設(shè)定 ?在文件的開頭處。另外 ?如果 ?你 ?習(xí)慣于 ?在UNIX之下編程,你 ?應(yīng)該注意到 ?打開文件 ?并不能 ?將 ?這個(gè)文件 ?剪短。你 ?得自己 ?將 ?文件 ?剪短。
下面的程序 ?示范了 ?如何利用 ?文件操作柄 ?來操作 ?文件:
| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | #import <Foundation/NSObject.h>#import <Foundation/NSString.h>#import <Foundation/NSFileHandle.h>#import <Foundation/NSFileManager.h>#import <Foundation/NSAutoreleasePool.h>#import <Foundation/NSData.h>int main(int argc,const char *argv[]){????NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];????NSFileHandle *inFile,*outFile;????NSData *buffer;????//為文件testfile創(chuàng)建文件操作柄,以便讀取數(shù)據(jù)????inFile=[NSFileHandle fileHandleForReadingAtPath:@"testfile"];????if(inFile==nil)????{????????NSLog(@"打開文件失敗!");????????return 1;????}????//創(chuàng)建文件testfile2????[[NSFileManager defaultManager] createFileAtPath:@"testfile2" contents:nil attributes:nil];????//為文件testfile2創(chuàng)建文件操作柄,以便寫入數(shù)據(jù)????outFile=[NSFileHandle fileHandleForWritingAtPath:@"testfile2"];????if(outFile==nil)????{????????NSLog(@"打開文件失敗!");????????return 2;????}????//將文件testfile2的長度剪短為0????????[outFile truncateFileAtOffset:0];????//將文件testfile中的數(shù)據(jù)讀取到緩沖區(qū)buffer當(dāng)中????buffer=[inFile readDataToEndOfFile];????//將緩沖區(qū)buffer中的數(shù)據(jù)寫入到文件testfile2當(dāng)中????[outFile writeData:buffer];????//將兩個(gè)文件關(guān)閉????[inFile closeFile];????[outFile closeFile];????//將testfile2的內(nèi)容顯示出來,用以驗(yàn)證之前的操作是否成功????NSLog(@"%@",[NSString stringWithContentsOfFile:@"testfile2" encoding:NSUTF8StringEncoding error:nil]);????[pool drain];????return 0;} |
運(yùn)行 ?這個(gè)程序過后,可以得到 ?這樣的結(jié)果:
| 1 2 | 2012-05-18 15:51:06.184 Sample[1507:707] 編程很有趣! Program ended with exit code: 0 |
readDataToEndOfFile:這項(xiàng)措施 ?可以讀取 ?長達(dá)1099511627542字節(jié)的數(shù)據(jù)。這 ?對于你所編寫的任何程序來說 ?都足夠大了。你 ?可以設(shè)定 ?一個(gè)循環(huán) ?利用 ?緩沖區(qū) ?在文件之間 ?傳輸 ?數(shù)據(jù),這個(gè) ?可以通過readDataOfLength:這項(xiàng)措施 ?辦到。緩沖區(qū)的大小 ?可以是 ?8192字節(jié) ?或者 ?131072字節(jié),因?yàn)??底層的操作系統(tǒng) ?一般 ?以這種大小的數(shù)據(jù)塊 ?執(zhí)行 ?輸入/輸出操作。
如果 ?一項(xiàng)措施 ?直到文件末尾處 ?都沒有讀取到 ?任何數(shù)據(jù),那么 ?這項(xiàng)措施 ?會(huì)產(chǎn)生出 ?一個(gè)空的NSData類型的物件。你 ?可以對 ?這個(gè)NSData類型的物件 ?采取 ?length這項(xiàng)措施 ?從而 ?檢查 ?是否 ?從文件中 ?讀取到 ?任何數(shù)據(jù)。
如果 ?你 ?打開 ?一個(gè)文件 ?進(jìn)行 ?讀、寫,那么 ?文件的操作位置 ?會(huì)被設(shè)定 ?在文件的開頭處。你 ?可以將 ?文件操作位置 ?設(shè)定為 ?其它位置,再 ?進(jìn)行 ?讀、寫操作,比如 ?將 ?文件的操作位置 ?設(shè)定 ?在第10個(gè)字節(jié)處,就可以這樣:
| 1 | [myFileHandle seekToFileOffset:10]; |
先獲取 ?當(dāng)前的文件操作位置,然后再 ?對 ?這個(gè)文件操作位置 ?加上 ?或者 ?減去 ?一定的字節(jié)數(shù),我們 ?就可以得到 ?一個(gè)相對的文件操作位置。比如,在當(dāng)前文件操作位置的基礎(chǔ)上 ?向前 ?跳過 ?128字節(jié),可以這樣:
| 1 | [myFileHandleseekToFileOffset:[myFileHandleoffsetInFile]+128]; |
如果 ?要將 ?當(dāng)前文件操作位置 ?向回 ?移動(dòng) ?5個(gè)整數(shù)值的長度,那么 ?我們 ?可以利用 ?這樣的語句:
| 1 | [myFileHandleseekToFileOffset:[myFileHandleoffsetInFile]-5*sizeof(int)]; |
總結(jié)
以上是生活随笔為你收集整理的NSFileHandle的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 静态度制作方法详细
- 下一篇: 利用DDE通信将PLC数据传输到EXCE