本人写了个小程序,是个类似于QQ的东西,客户端程序启动需要读取程序的配置文件和用户的配置文件,如果程序配置文件被删除,程序启动时会自动生成一个配置文件,但是如果配置文件被修改掉了,那么程序中用file.open来检测就不行,程序将无法运行.请各位大侠帮忙解决这个问题,谢了!
   另外,用户配置文件里面还存储着用户的账号,密码和其他信息,用户登陆的时候需要它,并且该文件是可以追加数据的.

解决方案 »

  1.   

    用API函数FindFirstChangeNotification,可以用于监视指定目录的文件的变更,并设置通知条件。
      

  2.   

    To MZP(mzp):
    将改动时间写入文件,如果用户进入文件将你写入的时间修改了,它可以在里面乱改一气,让你无法得到你写入的时间,那你怎么比较呢?
    To hcj2002(流浪者·躬自厚而薄责于人) (毕业ING & 求职ING) 
    能不能具体一点,这个API是怎么用的,可以解决我说的这个问题吗?
      

  3.   

    这个问题比较复杂,虽然主要是FindFirstChangeNotification,但还涉及到开几个线程来监控,有空我把有本书的例子给你贴上来。
      

  4.   

    UINT CFileChangeDoc::FileChangeWatch(LPVOID lpParam)
    {
    CFileChangeDoc* pDoc=(CFileChangeDoc*)lpParam;
    ASSERT(pDoc);

    CFile* pFile = pDoc->GetFile(pDoc->GetPathName(),
    CFile::modeRead|CFile::shareDenyWrite,NULL);
    ASSERT(pFile);
    if(pFile)
    {
    // 保存上次写文件的时间
    FILETIME ftLastWriteTime;
    BY_HANDLE_FILE_INFORMATION fileinfo;
    if(!GetFileInformationByHandle((HANDLE)pFile->m_hFile,&fileinfo))
    return 0;
    ftLastWriteTime=fileinfo.ftLastWriteTime;
    pDoc->ReleaseFile(pFile,FALSE);

    // 分离文件路径
    char path[_MAX_PATH];
    _splitpath(pDoc->GetPathName(), NULL, path, NULL, NULL);
    while(1)
    {
    // 获取文件更改通知句柄
    HANDLE hFileChanged=FindFirstChangeNotification(path,FALSE,
    FILE_NOTIFY_CHANGE_LAST_WRITE|
    FILE_NOTIFY_CHANGE_SIZE|
    FILE_NOTIFY_CHANGE_FILE_NAME);

    HANDLE hWaitEvents[]={pDoc->m_evStopWatch,hFileChanged};
    // 等待文件更改通知或停止监视事件
    DWORD dwResult=
    WaitForMultipleObjects(2,hWaitEvents,FALSE,INFINITE);
    FindCloseChangeNotification(hFileChanged);

    if(dwResult==WAIT_OBJECT_0+1)
    {
    // 获取文件的保存时间
    pFile = pDoc->GetFile(pDoc->GetPathName(),
    CFile::modeRead|CFile::shareDenyWrite,NULL);
    if(pFile)
    {
    if(GetFileInformationByHandle((HANDLE)pFile->m_hFile,
    &fileinfo))
    {
    // 判断文件是否已更改
    if((ftLastWriteTime.dwHighDateTime+
    ftLastWriteTime.dwLowDateTime)!=
    (fileinfo.ftLastWriteTime.dwHighDateTime+
    fileinfo.ftLastWriteTime.dwLowDateTime))
    pDoc->OnFileAlarm(FA_WRITTEN);
    // 保存修改时间
    ftLastWriteTime=fileinfo.ftLastWriteTime;
    }
    pDoc->ReleaseFile(pFile,FALSE);
    }
    else // 文件不存在,已被删除或移动
    {
    pDoc->OnFileAlarm(FA_FILELOST);
    }
    }
    else
    break;
    }
    }
    return 0;
    }
      

  5.   

    void CFileChangeDoc::WatchStart()
    {
    m_evStopWatch.ResetEvent();
    AfxBeginThread(FileChangeWatch,(LPVOID)this);
    }//Stop the watching thread
    void CFileChangeDoc::WatchStop()
    {
    m_evStopWatch.SetEvent();
    }
      

  6.   

    To zhaogaojian(米柑年成):
    你的这个方法我考虑了一下,觉得还是不是太好,不能完全解决我这个问题,如果用户把文件的创建时间和修改时间都改掉了,那样岂不是没办法准确检测了