多文档视图程序,当监控的文件夹下的文件被外部编辑器修改时,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,¬ify,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就监视不到了。