在程序开发时,为了帮助程序员更好的调试和排错,一般都需要日志记录,这是一个程序员应该养成的良好习惯。本文虽然是在WinCE平台下进行的,但是显然更能够在XP平台上运行,甚至只要对一些文件接口函数进行修改,可以在Linux平台下实现相应功能。
用C/C++编写WinCE程序时,写登录日志的方法。测试开发板:EPCS-6960I
一、C语言编写的带时间标记的日志记录方法
#include <stdio.h>
#include "string.h"
#include "process.h"
#include <time.h>
#include <direct.h>//创建文件目录
void WriteLogMsg(char chLogMsg[])
{
time_t timeval;
timeval=time(NULL);//获取本地时间
tm tim=*localtime(&timeval);//得到相应的结构体,然后进行内容提取
char strFilePath[40] = "Log\\";//如果是"\\Log\\"则到了当前盘符的根目录下了。
char strTimeFileName[20];//将当前时间转换成字符串---声明字符串长度的时候,要比实际长度多1,作为结尾符号
strftime(strTimeFileName, sizeof(strTimeFileName), "%Y-%m-%d",&tim);//年月日字符串
strcat(strTimeFileName,".logFile");//加上扩展名--登录日志
strcat(strFilePath,strTimeFileName);//得到完整的路径名
FILE *fp;//文件指针
if ((fp=fopen(strFilePath,"a"))==NULL)//以追加的形式往文件中写东西
{
mkdir("Log");//如果在当前目录下没有打开,则重新创建新目录
if ((fp=fopen(strFilePath,"a"))==NULL)//以追加的形式往文件中写东西
{
printf("Open Failed\n");
exit(0);
}
}
char chTimeTag[20]; //将时间转成字符串
strftime(chTimeTag, sizeof(chTimeTag), "%Y/%m/%d %X",&tim);//年月日时间字符串--作为登录日志中信息的时间标记头
fputs(chTimeTag,fp);//写入时间标记
fputs(" : ",fp);//分隔符号
fputs(chLogMsg,fp);//写入消息日志
fputs("\n",fp);//换行
int i=fclose(fp);
if (i==0)
{
printf("succeed!\n");
}else
{
printf("fail!\n");
}
}
void main()
{
WriteLogMsg("Hello World!Zsm");
}
二、用C++编写的带时间标记的日志记录方法
void WriteLogMsg(char chLogMsg[])
{
char strFilePath[40] = "\\FlashDisk2\\Log\\";//如果是"\\Log\\"则到了当前盘符的根目录下了。
char strTimeFileName[20];//将当前时间转换成字符串---声明字符串长度的时候,要比实际长度多1,作为结尾符号
SYSTEMTIME sysTime;
GetLocalTime( &sysTime ); //得到系统时间
sprintf(strTimeFileName,"%d-%d-%d",sysTime.wYear,sysTime.wMonth,sysTime.wDay);//"2010-09-21"
strcat(strTimeFileName,".logFile");//加上扩展名--登录日志
strcat(strFilePath,strTimeFileName);//得到完整的路径名
FILE *fp;//文件指针
if ((fp=fopen(strFilePath,"a"))==NULL)//以追加的形式往文件中写东西
{
//如果打开不成功,则一般表示没有Log目录
//创建Log目录,然后再重新打开--一般情况下,如果目录存在的话,就不会创建成功的。
if(!CreateDirectory(_T("\\FlashDisk2\\Log"),NULL))
{
printf("Create Directory failed!\n");
}else
{
printf("Create Directory succeed!\n");//cout << "OK" <<endl;
if ((fp=fopen(strFilePath,"a"))==NULL)//以追加的形式往文本文件中写东西
{
printf("Open Failed\n");
exit(0);
}
}
}
char strTimeTag[30];//="2010-09-21"; //将时间转成字符串
sprintf(strTimeTag,"%d-%d-%d %d:%d:%d ",sysTime.wYear,sysTime.wMonth,sysTime.wDay,
sysTime.wHour,sysTime.wMinute,sysTime.wSecond);//"2010-09-21"
//strftime(chTimeTag, sizeof(chTimeTag), "%Y/%m/%d %X",&tim);//年月日时间字符串--作为登录日志中信息的时间标记头
fputs(strTimeTag,fp);//写入时间标记
fputs(" : ",fp);//分隔符号
fputs(chLogMsg,fp);//写入消息日志
fputs("\n",fp);//换行
int i=fclose(fp);
if (i==0)
{
printf("succeed!\n");
}else
{
printf("fail!\n");
}
}
三、用C#编写的带时间标记的日志记录方法
/// <summary>
/// 重要应用:!!!!!写程序故障登录日志记录
/// </summary>
/// <param name="strLogMsg"></param>
public static void WriteLog(string strLogMsg)
{
System.IO.FileStream HFile;//先声明一个文件流的句柄,用来存储文件地址
string strFileName = System.DateTime.Today.ToString("yyyyMMdd");
HFile = OpenCreateFile(strFileName);//打开或者创建文件
strLogMsg = System.DateTime.Now.ToString() + " #Msg: " + strLogMsg + "\r\n";
WriteFile(HFile, strLogMsg);//写文件
CloseFile(HFile);//关闭文件
}
/// <summary>
/// 打开或者创建一个txt文档,这个文档存在于“移动设备”的根目录下面
/// “我的设备”中的所有文件夹,只有“FlashDisk”和“FlashDisk2”文件夹中的内容掉电后不会丢失,
/// 所以用户需要保存的文件可以保存在该文件夹中。
/// </summary>
/// <param name="strTextFileName">txt文件的名称</param>
/// <return>创建的文件的句柄</return>
private static System.IO.FileStream OpenCreateFile(string strTextFileName)
{
System.IO.FileStream HFile;
string strLogpath = "\\FlashDisk2\\Log";
if (!Directory.Exists(strLogpath))
Directory.CreateDirectory(strLogpath);
string strFilePath = "\\FlashDisk2\\Log\\" + strTextFileName + ".txt";//在移动设备的根目录下面
try
{
HFile = System.IO.File.Open(strFilePath, System.IO.FileMode.OpenOrCreate);
}
catch (Exception)
{
//MessageBox.Show("文件创建或打开失败");
HFile = null;
}
return HFile;
}
/// <summary>
/// 往文件中写入内容
/// </summary>
/// <param name="HFile">文件句柄</param>
/// <param name="strWriteText">需要写入的内容</param>
private static void WriteFile(System.IO.FileStream HFile, string strWriteText)
{
if (HFile == null)
{
// MessageBox.Show("文件未打开");
return;
}
//strWriteText = "Hello File";
Byte[] buffer;
buffer = System.Text.Encoding.GetEncoding(System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage).GetBytes(strWriteText);
HFile.Position = HFile.Length;
HFile.Write(buffer, 0, buffer.Length);
}
private static void CloseFile(System.IO.FileStream HFile)
{
if (HFile != null)
{
HFile.Close();
HFile = null;
}
}