我的日誌模組是這樣考慮的:
 
1、為了能夠方便的獲得當前的日誌檔案名,創建一個日誌檔案名稱索引檔,專門用來保存日誌檔的名稱
2、寫日誌時,首先到索引檔中讀取當前的日誌檔。
所謂當前的日誌檔,就是指當前用來記錄日誌的檔。因為日誌檔我規定了大小,如果其大小超過了規定值就要以當前日期重新創建日誌檔,所以日誌檔不止一個。
3、寫每一條日誌之前,都必須檢查當前日誌的長度是否超過了規定值,沒有超過則繼續寫入;反之新建日誌檔。所以日誌檔的大小與規定值之間的誤差不超過每條日誌的大小。
4、在Ui的構造函數中打開當前日誌檔,等待監控程式寫入日誌。

 

打開日誌檔,等待寫入日誌代碼:

 

1 void CFirewallLogData::OpenLogFileL()
2 {
3 TFileName iLogFileName ;
4
5 TFileName iLogFileIndexName(KFirewallLogFileIndexName) ;
6 if ( !IsFileExist(iLogFileIndexName) )
7 //如果沒有FirewallLogFileIndex.dat檔,新建該檔
8 //同時以當前時間為檔案名新建日誌檔,並將其打開
9 //同時保存新建的日誌檔的檔案名到FirewallLogFileIndex.dat檔中
10 {
11 RFile iFile ;
12 iFile.Create(CEikonEnv::Static()->FsSession(), KFirewallLogFileIndexName, EFileWrite) ;
13 //創建FirewallLogFileIndex.dat檔
14 iFile.Flush() ;
15 iFile.Close() ;
16 CreateLogFile(iLogFileName) ;
17 //創建新的日誌檔,並且將其檔案名稱寫入日誌檔案名稱索引檔中
18 }
19 else
20 //如果FirewallLogFileIndex.dat檔存在,取出當前日誌檔案名,將其打開
21 {
22 GetLogFileNameL( iLogFileName ) ;
23 //取出當前日誌檔的檔案名稱
24 GetLogFileDirAndNameL( iLogFileName );
25 //獲得日誌檔的全路徑
26 if ( !IsFileExist(iLogFileName) )
27 iLogFile.Create(CEikonEnv::Static()->FsSession(), iLogFileName, EFileWrite) ;
28 else
29 iLogFile.Open(CEikonEnv::Static()->FsSession(), iLogFileName, EFileWrite) ;
30 //以寫的方式打開改日誌檔
31 TInt iPos = 0 ;
32 iLogFile.Seek(ESeekEnd, iPos) ;
33 //將檔寫入點移到檔末尾,其中偏移量保存在iPos中
34 iLogWriter.Attach(iLogFile, iPos) ;
35 }
36 }
37
獲得日誌檔案名稱代碼:

 

1 void GetLogFileNameL(TFileName& aLogFileName)
2 {
3 RFile iFile ;
4 User::LeaveIfError( iFile.Open(CEikonEnv::Static()->FsSession(), KFirewallLogFileIndexName, EFileRead)) ;
5 TInt iSize = 0 ;
6 iFile.Size( iSize ) ;
7 //獲得檔大小
8 TInt iFileCount = iSize / (KFirewallLogFileNameSize * 2) ;
9 //計算日誌檔個數,因為Symbian預設採用Unicode編碼,所以用2個位元組表示一個字元,所以乘以2
10 iFile.Close() ;
11 RFileReadStream reader ;
12 reader.PushL() ;
13 User::LeaveIfError( reader.Open(CEikonEnv::Static()->FsSession(), KFirewallLogFileIndexName, EFileRead)) ;
14 for (TInt i = 0 ; i < iFileCount ; i++)
15 //讀取最後一個日誌檔案名
16 {
17 reader.ReadL((TUint16*)aLogFileName.Ptr(), KFirewallLogFileNameSize) ;
18 }
19 aLogFileName.SetLength(KFirewallLogFileNameSize) ;
20 CleanupStack::PopAndDestroy() ;
21 }
22
注意,在第19行,我一開始犯了一個錯誤,就是忘了為aLogFileName寫長度值,導致我始終無法取到其值。通過調試我發現aLogFileName的內容區域已經獲得了日誌檔案名稱,但是iLength屬性卻為0,此時才發現忘了長度賦值。希望我犯的這個錯誤,你不要重犯,這是一個挺難調試的錯誤。



創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()