by coastline
BaflUtils
Location: BAUTILS.H
Link against: bafl.lib
BaflUtils(Basic Application Framework Library)提供的全是靜態方法,使用起來非常爽,提供諸如FileExists、PathExists(檔案夾全路徑)、FolderExists(不必指定盤符)等方法。不過這些方法都需要傳遞一個RFs&,BaflUtils需要有這麼個FileSession才能進行相關操作。
EikFileUtils
Location: EIKFUTIL.H
Link against: eikcore.lib
類似於BaflUtils類,最大的不同在於這個類的靜態方法不需要傳遞RFs&,因此這個類經常用於GUI App中。不過這個類的方法沒有BaflUtils來得全面,比如居然沒有FileExists方法。
CFileMan
Location: f32file.h
Link against: efsrv.lib
以上兩個類本質上是對一個CFileMan的封裝。FileMan==FileManager,提供了Copy、Delete、Move、Attribs(改檔案屬性)等方法,通過NewL(RFs&)方法可以構造一個CFileMan,然後就可以通過它來操作檔案了。
CFileMan::NewL()有一個重載版本支援傳入一個MFileManObserver指標作為參數,或者可以通過SetObserver()設定觀察者,利用這個觀察者可以監視檔案狀況,以便對特定檔案的複製、刪除等操作進行響應。
RFs
Location: f32file.h
檔案操作當然不能不提RFs咯,這麼重量層級的人物。
個人理解EikFileUtils、BaflUtils都是通過RFs來調用CFileMan操作檔案,這裡面的關係還真TMD錯綜複雜啊,不過咱小程式員一個,不必深究太多,能用則用唄。RFs提供的方法真是多得嚇人,應有那個盡有。我就不囉嗦了,自己查API Doc去。
TParse/TParsePtr/TParsePtrC
Location: f32file.h
Link against: efsrv.lib
這又是一系列好玩又方便的類。後兩個最好用,以TParsePtr為例:
其建構函式TParsePtr(TDes&)接受一個TDes引用作為參數,可以對這個TDes進行一系列的判斷及操作。可以往這個TDes中追加檔案夾、分離檔案名稱、分離尾碼名等等實用的操作。這樣就不用大費周章地自己進行描述符操作,就能很智能地處理檔案路徑了,是不是很酷呢?
而TParsePtrC(TDesC&)除了不能用那些修改檔案名稱的函數,其餘功能和TParsePtr一致(所有的函數都定義在基類TParseBase中)。
檔案操作當然包含檔案讀寫咯,在此也作一下整理。
TFileText
Location: f32file.h
Link against: efsrv.lib
這個類是我最喜歡用的,因為它夠簡潔夠方便。
處理單行的文字檔讀寫(單行最大256個字元),檔案編碼必須是UTF-16 LE。
提供的函數也少得可憐:Read(), Seek(), Set(), TFileText(), Write() 其中還有一個是預設建構函式,真是可憐無比。但是很實用就是了,在做Console Exe的時候,用這個類來讀寫檔案那是相當爽快。沒有調研過控制台程式是否也有支援ini檔案的API,但是自己用TFileText寫一個讀寫ini檔案的類也是很方便的事。
虛擬碼如下:
TFileText ft; // you can also alloc ft with new operator
ft.Set(…);
TBuf<256> line; // you may want to use HBufC or RBuf…
while(KErrEof != ft.Read(line))
{
// your operation to line
}
…
ft.Write(…); // auto insert your TDesC into the new line
CLineReader
Location: VERSIT.H
Link against: versit.lib
類如其名,這個類只支援單行讀,不支援寫。不過用起來也不算太麻煩,因為是通過流讀取的,所以沒有單行256個字元的限制。
據我測試,檔案編碼必須是UTF-8 without BOM(就是檔案頭不帶EFBBBF三個位元組,這三個位元組對於UTF-8編碼來說不是必需的,但是Windows平台下的UTF-8編碼檔案都有這三個位元組),UTF-16的貌似不支援,下次作一個詳盡的測試。
範例程式碼:
RFs fs;
User::LeaveIfError(fs.Connect());
RFileReadStream fileReadStream;
fileReadStream.Open(fs,KConfigFilePath,EFileStreamText);
CLineReader* lineReader = CLineReader::NewL(fileReadStream);
TInt err(KErrNone);
while(true)
{
lineReader->ReadLineL(0,err);
if(KErrEof == err)
{
break;
}
// do sth with lineReader->iBufPtr
}
delete lineReader;
fileReadStream.Close();
fs.Close();
很方便吧。
RFile
Location: f32file.h
Link against: efsrv.lib
建立或者開啟一個檔案,可以對檔案進行所有的操作,讀啊寫啊,改名改屬性等等。
從Read()、Write()的所有重載版本看,參數都是TDesC8/TDes8 的,看來應該是對UTF-8 without BOM編碼的檔案適用。另外Read()、Write()都提供了同步、非同步兩種方式,可以按需要選用。
RFileReadStream/RFileWriteStream
Location: S32FILE.H
Link against: estor.lib
從RReadStream/RWriteStream派生出來的檔案流。
範例程式碼:
RFileWriteStream writer;
writer.PushL(); //推上清潔棧
User::LeaveIfError(writer.Replace(fileSession, KFileName, EFileWrite)); //將流與檔案綁定
writer << aTxt; //將aTxt的內容寫入流
writer.CommitL(); //提交,相當於Flush
writer.Pop();
writer.Close();