上一篇簡單的介紹瞭如何獲取檔案屬性,刪除,拷貝檔案等,本文繼續記錄Object C中檔案IO操作。
一. 獲取檔案的執行主目錄
在Object C中提供了一個方法 NSHomeDirectory() 用於獲得執行執行的主目錄,使用如下程式碼測試:
NSString *homePath=NSHomeDirectory(); NSLog(@"執行檔案的主目錄:%@",homePath);
通過以上程式碼可以正確的輸出應用程式的執行目錄,上一張也提到了檔案的目錄問題,這個和Windows系統的有些差別,在這個裡面沒有具體的碟符之分。
二. 建立一個新檔案
在Object C中如何使用函式建立一個新檔案,在自帶的庫中提供了相應的方法,createFileAtPath:(NSString*) contents:(NSString*) attributes:(NSDictionary *) 方法可以實現建立檔案。
NSString *newFilePath=[[NSString alloc] initWithFormat:@"/ISO DeV/a.txt"]; NSFileManager *fileManager=[NSFileManager defaultManager]; if([fileManager fileExistsAtPath:newFilePath]==NO){ NSLog(@"檔案不存在,接下來新建一個檔案"); [fileManager createFileAtPath:newFilePath contents:nil attributes:nil]; } if([fileManager fileExistsAtPath:newFilePath]==YES){ NSLog(@"新建檔案已經成功"); }
三. 檔案的讀寫
在.NET中提供了一些檔案讀寫的類,可以很方便的操作檔案的IO讀寫.在Object C中也存在著一個類NSFileHandler可以很方便的讀寫檔案和寫入檔案。檔案的讀寫操作一般分為以下幾個步驟:
(1)建立一個NSFileHandler物件,開啟檔案
(2) 對檔案進行IO的讀寫操作
(3) 關閉檔案
以上步驟和.NET中的基本類似,只是在類以及操作方法上不一樣,下面的程式碼就是如何建立一個NSFileHandle類.
NSFileHandle *fileHandler=[NSFileHandle fileHandleForReadingAtPath:newFilePath]; if(fileHandler==nil){ NSLog(@"檔案不存在"); }else{ NSLog(@"檔案存在"); } fileHandler=[NSFileHandle fileHandleForWritingAtPath:newFilePath]; if(fileHandler==nil){ NSLog(@"檔案不存在"); }else{ NSLog(@"檔案存在"); }
以上提供了兩個方法 fileHandleReadingAtPath 和 fileHandleWritingAtPath 用於獲取NSFileHandle物件例項。但是以上兩個方法適用於讀取和寫入檔案的,如果檔案路徑不存在則返回nil.在上一章說道了建立一個新的檔案,所以在這之前我們需要先建立該檔案,並且在其中初始化一些內容:
[fileManager createFileAtPath:newFilePath contents:@"dsadafdasdfasfdsa" attributes:nil];
以上程式碼很熟悉,我們新建一個檔案,並且在檔案中寫入一些內容。
四. 檔案的讀寫
從上面可的記錄中我們得到讀寫檔案所用的方式不一樣,現在我們做一個比較簡單的例子: 將一個檔案中的內容讀取出來,然後寫入到另外一個檔案。但是這裡我們要先確保檔案是存在的。
第一步:讀取檔案
NSFileHandle *fileHandler=[NSFileHandle fileHandleForReadingAtPath:newFilePath]; if(fileHandler==nil){ NSLog(@"檔案不存在"); }else{ NSLog(@"檔案存在"); NSData *buffer=[fileHandler readDataToEndOfFile]; }
我們使用fileHandleForReadingAtPath 開啟一個檔案,這個檔案的路徑為newFilePath,而且這個路徑是肯定存在的,這個檔案中有一些內容。下面有個方法readDataToEndOfFile 用於讀取檔案中的內容,得到一個NSData物件例項,這裡的NSData 相當於byte位元組陣列一樣[個人理解]。
第二步:寫入檔案內容
NSFileHandle *write=[NSFileHandle fileHandleForWritingAtPath:@"/ISO DeV/File.txt"]; [write writeData:buffer]; [write closeFile]; [fileHandler closeFile];
在根據fileHandleForWritingAtPath建立一個NSFileHandle 的物件例項,這個例項用於來寫入檔案內容. 我們將上面得到的NSData資料寫入到檔案中。提供了writeData方法用於寫資料。操作完成之後要關閉檔案。
這裡和.NET中的寫檔案有點區別,在.NET中有一個Flush的操作過程,用於重新整理緩衝去,這裡貌似沒有這個操作。
最後使用如下程式碼驗證一下是否寫入到新的檔案,也當回顧一下這個方法:
NSLog(@"%@",[NSString stringWithContentsOfFile:@"/ISO DeV/File.txt" encoding:NSUTF8StringEncoding error:nil]);
可以正確的輸出其內容,而且檔案內容和原來的檔案內容一致。
五. 追加檔案內容
如果要像寫入檔案的時候不覆蓋原有內容,我們必須設定檔案的NSFileHandle的偏移量,如果是追加檔案我們只需要偏移量移到最後即可。而設定檔案操作偏移量使用方法seekToFileOffset 或者使用 seekToEndOfFile 將檔案偏移量移到最後面。
NSString *value=@"adsfasfasf4343434"; NSData *data= [value dataUsingEncoding:NSUTF8StringEncoding]; NSFileHandle *write=[NSFileHandle fileHandleForWritingAtPath:@"/ISO DeV/File.txt"]; [write seekToEndOfFile]; [write writeData:data]; [write closeFile];
通過以上程式碼我們可以將新的內容新增到檔案fIle.txt的最末尾.如果要再中間插入一下內容,我們只需要設定偏移量。
NSString *value=@"555555555555"; NSData *data= [value dataUsingEncoding:NSUTF8StringEncoding]; NSFileHandle *write=[NSFileHandle fileHandleForWritingAtPath:@"/ISO DeV/File.txt"]; [write seekToFileOffset:3]; [write writeData:data]; [write closeFile];
我們不將偏移量設定到最末尾即可。