现在的位置: 首页 > 综合 > 正文

写UNICODE格式的文本日志文件(UNICODE编码)

2013年09月17日 ⁄ 综合 ⁄ 共 3151字 ⁄ 字号 评论关闭

转载:http://blog.csdn.net/abcpanpeng/article/details/1481740

HANDLE CreateUnicodeFile(CStringW strPath)
{
    HANDLE hFile=NULL;
    //创建文件
    hFile=CreateFile(strPath,
        GENERIC_WRITE|GENERIC_READ,
        FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE,
        NULL,
        OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
    if(INVALID_HANDLE_VALUE==hFile)
    {
        AfxMessageBox(FormartLastError(GetLastError()));
        return NULL;
    }
    DWORD dwValue=0;
    DWORD dwSize=0;
    dwSize = GetFileSize (hFile, NULL) ; 
    if (dwSize == 0xFFFFFFFF) 
    { 
        AfxMessageBox(FormartLastError(GetLastError()));
        CloseHandle(hFile);
        return NULL;
    } 
    if(dwSize==0)
    {
        TCHAR p=0xfeff;//UNICODE文件开头标志
        if(!WriteFile(hFile,&p,sizeof(TCHAR),&dwValue,NULL))
        {
            AfxMessageBox(FormartLastError(GetLastError()));
            CloseHandle(hFile);
            return NULL;
        }
    }
    return hFile;
}

BOOL WriteLogFile(CStringW sLogMsg)
{
    CStringW sFileName;
    if(sFileName.IsEmpty())
    {
        sFileName=GetCurrentPath();//获取应用程序所在目录
        sFileName=sFileName+TEXT("log//");//创建log文件夹
        CheckDirectory(sFileName);
        CString sdate;
        CTime tt=CTime::GetTickCount();
        CString strtt=tt.Format("log_%Y-%m-%d.txt");
        sFileName=sFileName+strtt;
    }
    HANDLE hFile=CreateUnicodeFile(sFileName);//创建UNICODE格式文件
    if(NULL==hFile)
    {
        AfxMessageBox(FormartLastError(GetLastError()));
        return FALSE;
    }
    DWORD dwValue=0;
    DWORD dwSize=0;
    dwSize = GetFileSize (hFile, NULL) ; 
    if (dwSize == 0xFFFFFFFF) 
    { 
        AfxMessageBox(FormartLastError(GetLastError()));
        CloseHandle(hFile);
        return FALSE;
    }
    long logcount=0;
    int iLength=0;
    DWORD ftype=GetFileType(hFile);
    if(ftype!=FILE_TYPE_DISK)//检测文件是否为磁盘文件
        return FALSE;
    TCHAR buff[10];
    wmemset((WCHAR*)buff,L'0',10);
    if(dwSize!=2)//如果已经写日志
    {
        //移动至文件开头sizeof(TCHAR)处
        DWORD p=SetFilePointer(hFile,sizeof(TCHAR),NULL,FILE_CURRENT);
        if(p==0xFFFFFFFF)
        {
            return FALSE;
        }
        //读取日志记录数   00000000
        if(!ReadFile(hFile,buff,10*sizeof(TCHAR),&dwValue,NULL))
        {
            AfxMessageBox(FormartLastError(GetLastError()));
            CloseHandle(hFile);
            return FALSE;
        }
        logcount=wcstol((WCHAR*)buff,NULL,10);
    }
    CStringW sCount;
    logcount=logcount+1;
    sCount.Format(TEXT("%d"),logcount);
    for(int i=0;i<sCount.GetLength();i++)
        buff[8-sCount.GetLength()+i]=sCount[i];
    buff[8]='/r';
    buff[9]='/n';
    SetFilePointer(hFile,sizeof(TCHAR),NULL,FILE_BEGIN);//移动至文件开头2
    //写日志记录数
    if(!WriteFile(hFile,buff,(int)10*sizeof(TCHAR),&dwValue,NULL))
    {
        AfxMessageBox(FormartLastError(GetLastError()));
        CloseHandle(hFile);
        return FALSE;
    }
    SetFilePointer(hFile,NULL,NULL,FILE_END);//移动至文件尾部
    CTime t=CTime::GetTickCount();
    CString sMsg=t.Format("[%Y-%m-%d %H:%M:%S] ");
    sLogMsg=sMsg+sLogMsg+TEXT("/r/n");
    iLength = sLogMsg.GetLength();
    //写日志
    if(!WriteFile(hFile,sLogMsg.GetBuffer(),(int)iLength*sizeof(TCHAR), &dwValue, NULL))
    {
        AfxMessageBox(FormartLastError(GetLastError()));
        CloseHandle(hFile);
        return FALSE;
    }
    //关闭文件
    CloseHandle(hFile);
    return TRUE;

抱歉!评论已关闭.