Object C學習筆記26-檔案管理(二)

賀臣發表於2014-05-03

  上一篇簡單的介紹瞭如何獲取檔案屬性,刪除,拷貝檔案等,本文繼續記錄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];

    我們不將偏移量設定到最末尾即可。

相關文章