在資源管理器中,刪除一個文件,更改一個文件夾名稱,都能及時刷新。這是怎麼做到的呢?答案是使用了文件改變通知。
先看一個結構
typedef struct tagSHCHANGENOTIFYENTRY {
DWORD dwEventMask;
LPTSTR pszWatchDir;
BOOL fRecursive;
} SHCHANGENOTIFYENTRY;
要接收文件改變的消息,我們要使用一個窗口hWnd,在窗口創建的WM_CREATE消息處註冊:
SHCHANGENOTIFYENTRY schneNotifyEntry;
schneNotifyEntry.dwEventMask = SHCNE_ALLEVENTS;//監視所有事件
schneNotifyEntry.pszWatchDir = NULL;//要監視的目錄名,NULL表示所有
schneNotifyEntry.fRecursive = TRUE;//監視目錄時,是否遞歸
SHChangeNotifyRegister(hWnd, &schneNotifyEntry);
在窗口的過程函數裏,我們響應WM_FILECHANGEINFO消息
case WM_FILECHANGEINFO:
{
FILECHANGENOTIFY *lpfcn;
FILECHANGEINFO *lpfci;
lpfcn = (FILECHANGENOTIFY *)lParam;
if (NULL == lpfcn)
{
break;
}
lpfci = &(lpfcn->fci);
if (NULL == lpfci)
{
break;
}
else
{
if (FALSE == SHCNEEvent(lpfci))
{
MessageBox(TEXT("SCHNE Event failed"), TEXT("Error"), MB_OK);
}
}
SHChangeNotifyFree(lpfcn);
}
break;
SHCNEEvent函數實現如下:
BOOL SHCNEEvent(FILECHANGEINFO *lpfci)
{
//lpfci->wEventId,事件
//lpfci->dwItem1,舊的文件或目錄名
//lpfci->dwItem2,新的文件或目錄名
//lpfci->dwAttributes,文件或目錄特性
//lpfci->ftModified,文件改變時的時間
//lpfci->nFileSize,文件大小
switch (lpfci->wEventId)
{
case SHCNE_RENAMEITEM:
break;
case SHCNE_CREATE:
break;
case SHCNE_DELETE:
break;
case SHCNE_MKDIR:
break;
case SHCNE_RMDIR:
break;
case SHCNE_MEDIAINSERTED:
break;
case SHCNE_MEDIAREMOVED:
break;
case SHCNE_DRIVEADD:
break;
case SHCNE_DRIVEREMOVED:
break;
case SHCNE_NETSHARE:
break;
case SHCNE_NETUNSHARE:
break;
case SHCNE_ATTRIBUTES:
break;
case SHCNE_UPDATEDIR:
break;
case SHCNE_SERVERDISCONNECT:
break;
case SHCNE_RENAMEFOLDER:
break;
default:
break;
}
return TRUE;
}
根據事件,就可以知道是哪個文件或目錄發生了改變。
最後,在hWnd銷燬處,要註銷:
SHChangeNotifyDeregister(hWnd);
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/pknife/archive/2009/08/27/4490213.aspx