轉自:http://www.cnblogs.com/beer/archive/2010/09/24/1833783.html
在程序開發時,爲了幫助程序員更好的調試和排錯,一般都需要日誌記錄,這是一個程序員應該養成的良好習慣。本文雖然是在WinCE平臺下進行的,但是顯然更能夠在XP平臺上運行,甚至只要對一些文件接口函數進行修改,可以在Linux平臺下實現相應功能。
用C/C++編寫WinCE程序時,寫登錄日誌的方法。測試開發板:EPCS-6960I
一、C語言編寫的帶時間標記的日誌記錄方法
#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++編寫的帶時間標記的日誌記錄方法
{
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>
/// <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;
}
}