日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NSFileHandle

發(fā)布時(shí)間:2023/12/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NSFileHandle 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

利用 ?文件操作柄,也就是 ?NSFileHandle這類物件,我們 ?可以更加近距離地 ?操作 ?文件。一般來說,操作 ?文件 ?需要 ?下面三個(gè)步驟:

  • 打開 ?文件,為 ?這個(gè)文件 ?創(chuàng)建 ?文件操作柄;
  • 進(jìn)行 ?輸入/輸出操作;
  • 關(guān)閉 ?文件。
  • 下面的表格 ?總結(jié)了 ?可以對(duì)文件操作柄所采取的措施:

    措施名稱 描述
    +(NSFileHandle *)fileHandleForReadingAtPath:path 打開文件以便讀取
    +(NSFileHandle *)fileHandleForWritingAtPath:path 打開文件以便寫入
    +(NSFileHandle *)fileHandleForUpdatingAtPath:path 打開文件以便讀寫
    -(NSData *)availableData 產(chǎn)生的結(jié)果為其實(shí)施對(duì)象中可用的數(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ù)。這 ?對(duì)于你所編寫的任何程序來說 ?都足夠大了。你 ?可以設(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類型的物件。你 ?可以對(duì) ?這個(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)前的文件操作位置,然后再 ?對(duì) ?這個(gè)文件操作位置 ?加上 ?或者 ?減去 ?一定的字節(jié)數(shù),我們 ?就可以得到 ?一個(gè)相對(duì)的文件操作位置。比如,在當(dāng)前文件操作位置的基礎(chǔ)上 ?向前 ?跳過 ?128字節(jié),可以這樣:

    1 [myFileHandleseekToFileOffset:[myFileHandleoffsetInFile]+128];

    如果 ?要將 ?當(dāng)前文件操作位置 ?向回 ?移動(dòng) ?5個(gè)整數(shù)值的長度,那么 ?我們 ?可以利用 ?這樣的語句:

    1 [myFileHandleseekToFileOffset:[myFileHandleoffsetInFile]-5*sizeof(int)];

    總結(jié)

    以上是生活随笔為你收集整理的NSFileHandle的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。