[Symbian项目进展]防火墙日志模块的开发,附关键代码
2006-12-04 23:26
671 查看
我的日志模块是这样考虑的:
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,此时才发现忘了长度赋值。希望我犯的这个错误,你不要重犯,这是一个挺难调试的错误。
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,此时才发现忘了长度赋值。希望我犯的这个错误,你不要重犯,这是一个挺难调试的错误。
相关文章推荐
- 防火墙日志模块的开发,附关键代码
- 做的一个微信在线考试答题的模块,基于THINKPHP5开发的,逻辑图和关键代码奉上
- Symbian项目进展]网络流量曲线图,代码+效果图
- [Symbian项目进展]网络流量曲线图,代码+效果图
- S4.7_Struts2_Include 项目代码分功能模块开发
- C++项目开发之日志模块(一)
- 用C语言开发一个BT下载软件 (四) ------ 代码实现-3-出错处理模块和运行日志模块
- [Symbian项目进展]系统设置搞掂 :) 把相关代码贴出来
- [Symbian项目进展]网络流量曲线图,代码+效果图
- [Symbian项目进展]怎样在S60指示面板上画图标,原代码+示意图
- 没头没尾--项目开发笔记:异常处理与日志记录代码自动生成(工具能生成多少代码!?续一)
- [Symbian项目进展]网络流量曲线图,代码+效果图
- PDA打印处罚单系统项目模块设计--开发代码
- javaWEB项目心得之模块开发步骤
- 献给初学iOS的小盆友们——微博app项目开发之十二自定义cell代码补全
- 循序渐进开发WinForm项目(4)--Winform界面模块的集成使用
- 开发项目常用功能及模块
- Android开发 开启闪光灯 关键代码
- Spark-项目中分析日志的核心代码
- Symbian项目开发小记