Object C學習筆記26-文件管理(二)


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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM