上一篇簡單的介紹了如何獲取文件屬性,刪除,拷貝文件等,本文繼續記錄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];
我們不將偏移量設置到最末尾即可。