在windows mobile上監控目錄裡的文件

在Windows Mobile上,如果我們想要監控某個指定的目錄,可以使用SHChangeNotifyRegister這系列的函數來達到效果:


假設我們已經開了一個winMobile專案,然後建立一個繼承CDialog的class:

class CFileChangeInfoDlg : public CDialog
{


然後在class裡新增:

    afx_msg LRESULT OnFileChangeInfo(WPARAM wParam, LPARAM lParam);    // 文件監控

再來重載OnInitDialog,並在該函數加上以下:

    // 啟動監控
    std::wstring strPath = _T("\\My Documents\\我的圖片");    // 要監控的目錄
    SHCHANGENOTIFYENTRY shcne = {0};
    shcne.fRecursive = FALSE; // 只監控最上層
    shcne.pszWatchDir = const_cast<LPTSTR>(strPath.c_str());
    shcne.dwEventMask = SHCNE_ALLEVENTS ;    // 所有Event都收

    if ( !SHChangeNotifyRegister(GetSafeHwnd() , &shcne)) // 啟動監控
    {
        TRACE( _T("啟動監控失敗"));
    }

SHChangeNotifyRegister( HWND hwnd, SHCHANGENOTIFYENTRY *pshcne)需要代入兩個引數,第一個一看就知道是代handle,第二個是代入SHCHANGENOTIFYENTRY結構,來看一下SHCHANGENOTIFYENTRY是什麼東西:

typedef struct tagSHCHANGENOTIFYENTRY {
DWORD   dwEventMask;   
LPTSTR  pszWatchDir;  
BOOL    fRecursive; 
} SHCHANGENOTIFYENTRY;

  • dwEventMask:指定什麼時候會發送 WM_FILECHANGEINFO 訊息。
  • pszWatchDir:指定要監控那個目錄。
  • fRecursive:指定是否只監控指定目錄(flase)還是也監控裡面的子目錄(true)。

以上都完畢後,然後在BEGIN_MESSAGE_MAP加上:

BEGIN_MESSAGE_MAP(CFileChangeInfoDlg, CDialog)
    ON_MESSAGE(WM_FILECHANGEINFO, &CFileChangeInfoDlg::OnFileChangeInfo)
END_MESSAGE_MAP()

然後再加上:

LRESULT CFileChangeInfoDlg::OnFileChangeInfo(WPARAM wParam, LPARAM lParam)
{
    FILECHANGENOTIFY* pfcn = reinterpret_cast<FILECHANGENOTIFY*>(lParam);    // 監控文件的操作
    FILECHANGEINFO& fci = pfcn->fci;

    if ((fci.uFlags & SHCNF_PATH) == true)
    {
        switch(fci.wEventId)
        {
        case SHCNE_CREATE:
            {
                AfxMessageBox( _T("Create!"));
            }
            break;
        case SHCNE_RENAME:
            {
                AfxMessageBox( _T("Rename!"));
            }
            break;
        case SHCNE_DELETE:
            {
                AfxMessageBox( _T("Delete!"));
            }
            break;
        }
    }

    SHChangeNotifyFree(pfcn); // 先釋放,等待下次
    return 0;
}

在switch裡面就可以撰寫當檔案Create、Rename,或Delete時所做的處理了,另外,如果Mobile跟PC連線時,把檔案拉到要監控的目錄時,是屬於Rename的情況!不過如果是Mobile自己本身的copy&paste的話,就是Create了。

如果不想要監控了,再使用SHChangeNotifyDeregister(hWnd)即可!

0 意見:

張貼留言