最近学习的关于文件日志的编写。里面涉及到的主要是文件操作、目录创建,还有就是重构和STL字符串string操作应用。
具体思想是单线程写入(保证安全写入)+管理,管理分管目录创建、文件建立。单线程维护数据安全,管理负责建立目录、创建文件和WriteFile。
考虑到程序中应用此Log,最少需要用到LOG_MAIN.log、LOG_DEBUG.log、LOG_ERROR.log三种情况,所以就简单处理为一个结构体(类型+数据);
Safe_log类中就需要带参构造函数,传入需要的文件名和路径,目的能够在初始化时就能够把文件目录和log内部起始构造完成。然后下一步就是处理出文件名称存入m_LogName,启动线程后开始处理文件路径和创建文件,使用GetModuleFilename获取文件下目录,字符操作去掉XXX.exe后+你输入的文件名称m_LogName+从系统获取的日期和时间,最后组成自己需要的一个文件目录,然后通过CreateFileName创建目录,首先需要检查目录是否存在如果存在就不需要建立,不存在则继续建立,调用的是(bool)DirExists,应用GetFileAttributes & FILE_ATTRIBUTE_DIRECTORY查看文件是否建立。如果文件存在就应该结束该任务,否则就接着建立目录,应用CreateDirectory建立新目录,目录需要一级一级的建立,如此就需要循环调用CreateFileName,可以节省自己去一个一个建立并验证是否一级一级的目录是否存在,此函数会自己验证知道目录存在并存入栈中,知道目录存在后在一级一级释放目录,最终建立完整目录。
目录建立完成后就需要operator()把你要传入的信息名称和数据组合成结构体,并发送到线程队列中去处理,并在该函数中激活线程中Execute中的WaitForSingleObject函数(SetEvent),为保证线程安全需要在队列write和read时需要加锁。在Executive中取出一个结构体,处理后发送到Log中(管理类的基函数),然后再Safe_Log中处理文件的write和read。
其中需要用到strrchr和strchr来处理字符串,需要m_strLocalPath、m_strHelpPath存储文件目录。
文件创建HFILE应用的是最原始的_lcreat、_lopen、_llseek、_lwrite和_lread。
还应用到两个格式化函数用来把系统时间和数据结合成字符串,共同存储进log文档。_snprintf和_vsnprintf。
在operator()中还要解决变参问题,就是va_list和va_end把参数全部格式化入某个变量中。
文件创立也用到宏,把LOG_MAIN.log、LOG_DEBUG.log、LOG_ERROR.log三个字符串放入到管理中的队列中。创建时,直接应用从中取出做为文件名称。