当前位置: 代码迷 >> VC/MFC >> ReadDirectoryChangesW 监听文件名乱码的有关问题
  详细解决方案

ReadDirectoryChangesW 监听文件名乱码的有关问题

热度:185   发布时间:2016-05-02 03:28:20.0
ReadDirectoryChangesW 监听文件名乱码的问题
多文档视图程序,当监控的文件夹下的文件被外部编辑器修改时,ModefilyFileName 可以等到正确的文件名,但不是被外部编辑器修改,而是直接编辑并保存后,得到的文件名则是一个乱码,是何原因呢?本程序为UNICODE
UINT MonitorThread(LPVOID PARAM)
{
DWORD cbBytes;
WCHAR notify[1024];
int cnt = 0;
CString ModefilyFileNamebuf;
int count = 0; //文件数量。可能同时拷贝、删除多个文件,可以进行更友好的提示。

ModefilyFileNamebuf = ModefilyFileName;
     HANDLE dirHandle = CreateFile(quanjupath,GENERIC_READ | GENERIC_WRITE | FILE_LIST_DIRECTORY,
 FILE_SHARE_READ | FILE_SHARE_WRITE,
 NULL,
 OPEN_EXISTING,
 FILE_FLAG_BACKUP_SEMANTICS,
 NULL);
 if(dirHandle == INVALID_HANDLE_VALUE) //若网络重定向或目标文件系统不支持该操作,函数失败,同时调用GetLastError()返回ERROR_INVALID_FUNCTION
     {
 int error = GetLastError();
 return 0;
     }
     memset(notify,0,1024*sizeof(WCHAR));
     FILE_NOTIFY_INFORMATION *pnotify = (FILE_NOTIFY_INFORMATION*)notify; 
     while(bThreadRunning)
     {  
         if(ReadDirectoryChangesW(dirHandle,&notify,1024,true,
              FILE_NOTIFY_CHANGE_FILE_NAME |
              FILE_NOTIFY_CHANGE_DIR_NAME |
             FILE_NOTIFY_CHANGE_CREATION | 
              FILE_NOTIFY_CHANGE_LAST_WRITE,
              | FILE_NOTIFY_CHANGE_SIZE,
              &cbBytes,NULL,NULL))
{
 ModefilyFileName = pnotify->FileName;
 ModefilyFileName = ModefilyFileName.Left(pnotify->FileNameLength/sizeof(WCHAR));
  //设置类型过滤器,监听文件创建、更改、删除、重命名等
              switch(pnotify->Action)
  {
  case FILE_ACTION_ADDED:
                       break;
  case FILE_ACTION_MODIFIED:

 ::SendMessage(MainThread->m_hWnd,WM_UPDATE,(WPARAM)0,(LPARAM)0);
  break;
  case FILE_ACTION_REMOVED:
  break;
  case FILE_ACTION_RENAMED_OLD_NAME:
  break;
  default:
  break;
              }
 }  
 }
 CloseHandle(dirHandle);
 return 0;

------解决思路----------------------
有可能是先保存一个随即的名称,然后再保存回来。或者先保存到临时目录等,这要看具体编辑器的行为和逻辑。
------解决思路----------------------
保存到你不知道的临时目录,ReadDirectoryChangesW就监视不到了。