[Symbian项目进展]防火墙日志模块的开发,附关键代码

我的日志模块是这样考虑的:

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,此时才发现忘了长度赋值。希望我犯的这个错误,你不要重犯,这是一个挺难调试的错误。

你可能感兴趣的:([Symbian项目进展]防火墙日志模块的开发,附关键代码)