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