BOOL CsgiLog::SgiOut(const char *fmt, ...)
{
 if(m_csFileName.IsEmpty())
 return FALSE;
 if(!m_bEnable)
 return TRUE;
 if (!AfxIsValidString(fmt, -1))
 return FALSE;
try
 {
 va_list argptr; va_start(argptr,fmt); _vsnprintf(m_tBuff,tbuf_size,fmt,argptr); va_end(argptr); }
catch(...)
 {
 m_tBuff[0]=0;
 }
 BOOL bOK=FALSE;
lin1: FILE *fp = fopen(m_csFileName,"a");
 if( ferror( fp )>=0 )  {
         perror( "创建日志失败" );      } if(fp)
 {
 if(m_bPrintAppName)
 {
 fprintf(fp,"%s : ", m_csAppName); }
 if(m_bPrintTime)
 {
 CTime ct;
 ct=CTime::GetCurrentTime();
 fprintf(fp,"%s : ",ct.Format("%m/%d/%Y %H:%m:%s")); }
 fprintf(fp,"%s\n", m_tBuff);
//控制文件大小
 CString szFile=m_csFileName;
 int nFileSize=0,dd=6;
 CFileFind finder;
 CFile tt; if(finder.FindFile(szFile)){    finder.FindNextFile();       nFileSize = finder.GetLength();    //文件大小在这里
    if (nFileSize >=dd)
    {
// FILE *fpp = fopen("bac"+m_csFileName,"a");
  fclose(fp);
  tt.Remove("bactx.txt");
  tt.Rename("e:\\log\\tx.txt","e:\\log\\bactx.txt");//能不能用变量取代??  goto lin1;
     //FILE *fpp = fopen(m_csFileName,"a");
 
    };       finder.Close(); }
这个代码是生成日志文件,然后判断日志文件的大小,如果文件大于规定的大小后,将文件改名,然后重新生成日志文件继续记录.
大家看看我的程序错在那里??高手帮忙!

解决方案 »

  1.   

    if(!m_bEnable)
     return TRUE;
    这句是什么意思呢?如果不是Enable就返回TRUE?
    另外你的这些
    CFileFind finder;
     CFile tt; if(finder.FindFile(szFile)){    finder.FindNextFile();       nFileSize = finder.GetLength();    //文件大小在这里
        if (nFileSize >=dd)
        {
    // FILE *fpp = fopen("bac"+m_csFileName,"a");
      fclose(fp);----------------------------------->没有打开文件怎么要关闭?
      tt.Remove("bactx.txt");--------直接用CFile::Remove()
      tt.Rename("e:\\log\\tx.txt","e:\\log\\bactx.txt");//能不能用变量取代??-----------------------直接用CFile::Rename()效率很低下呢,那个CFileFind 我的经验是比较难用的,尤其是你只有一个文件需要查找的时候。你要判断文件的大小可以使用下面的方法:
    CFileStatus fStatus;
    LONG lLength;
    if (CFile::GetStatus(FileName, fStatus))
    {
    lLength = fStatus.m_size;
    }
    else
    {
    lLength=-1;//表明FileName指定的文件是不存在的
    }