16,549
社区成员




比如监视路径 C:\AAA\,在其子文件夹 C:\AAA\BBB\ 下删除 20 个文件,收到了 SHCNE_UPDATEDIR 类型消息,现在问题是 收到的路径不正确,我想要收到的刷新路径是 C:\AAA\BBB\,但实际收到的是 C:\AAA\,请问如何解决?
void CTestDlg::FileMon()
{
IShellFolder* lpsfDesktop;
SHGetDesktopFolder(&lpsfDesktop);
LPITEMIDLIST pidl;
lpsfDesktop->ParseDisplayName(NULL, NULL, _T("C:\\AAA"), NULL, &pidl, NULL);
lpsfDesktop->Release();
SHChangeNotifyEntry shcne;
shcne.pidl = pidl;
shcne.fRecursive = TRUE;
ULONG id = SHChangeNotifyRegister(m_hWnd,
SHCNRF_InterruptLevel | SHCNRF_ShellLevel | SHCNRF_RecursiveInterrupt,
SHCNE_ALLEVENTS, WM_USER_FILEMON,
1, &shcne);
}
LRESULT CTestDlg::OnFileMonMsg(WPARAM wParam, LPARAM lParam)
{
PIDLIST_ABSOLUTE* pPa = (PIDLIST_ABSOLUTE*)wParam;
static wchar_t Buffer[2048];
switch (lParam)
{
case SHCNE_RENAMEITEM:wcscpy(Buffer, L"SHCNE_RENAMEITEM:"); break;
case SHCNE_CREATE:wcscpy(Buffer, L"SHCNE_CREATE:"); break;
case SHCNE_DELETE:wcscpy(Buffer, L"SHCNE_DELETE:"); break;
case SHCNE_MKDIR:wcscpy(Buffer, L"SHCNE_MKDIR:"); break;
case SHCNE_RMDIR:wcscpy(Buffer, L"SHCNE_RMDIR:"); break;
case SHCNE_MEDIAINSERTED:wcscpy(Buffer, L"SHCNE_MEDIAINSERTED:"); break;
case SHCNE_MEDIAREMOVED:wcscpy(Buffer, L"SHCNE_MEDIAREMOVED:"); break;
case SHCNE_DRIVEREMOVED:wcscpy(Buffer, L"SHCNE_DRIVEREMOVED:"); break;
case SHCNE_DRIVEADD:wcscpy(Buffer, L"SHCNE_DRIVEADD:"); break;
case SHCNE_NETSHARE:wcscpy(Buffer, L"SHCNE_NETSHARE:"); break;
case SHCNE_NETUNSHARE:wcscpy(Buffer, L"SHCNE_NETUNSHARE:"); break;
case SHCNE_ATTRIBUTES:wcscpy(Buffer, L"SHCNE_ATTRIBUTES:"); break;
case SHCNE_UPDATEDIR:wcscpy(Buffer, L"SHCNE_UPDATEDIR:"); break;
case SHCNE_UPDATEITEM:wcscpy(Buffer, L"SHCNE_UPDATEITEM:"); break;
case SHCNE_SERVERDISCONNECT:wcscpy(Buffer, L"SHCNE_SERVERDISCONNECT:"); break;
case SHCNE_UPDATEIMAGE:wcscpy(Buffer, L"SHCNE_UPDATEIMAGE:"); break;
case SHCNE_DRIVEADDGUI:wcscpy(Buffer, L"SHCNE_DRIVEADDGUI:"); break;
case SHCNE_RENAMEFOLDER:wcscpy(Buffer, L"SHCNE_RENAMEFOLDER:"); break;
case SHCNE_FREESPACE:wcscpy(Buffer, L"SHCNE_FREESPACE:"); break;
}
TCHAR szFile1[MAX_PATH];
TCHAR szFile2[MAX_PATH];
CString str;
if (SHGetPathFromIDListW(*pPa, szFile1))
{
if (SHGetPathFromIDListW(pPa[1], szFile2))
{
str.Format(_T("%s %s -> %s"), Buffer, szFile1, szFile2);
}
else
{
str.Format(_T("%s %s"), Buffer, szFile1);
}
TRACE(_T("%s\n"), str);
}
return 0;
}
试试ReadDirectoryChangesW