Windows Mobile中的文件改變通知

在資源管理器中,刪除一個文件,更改一個文件夾名稱,都能及時刷新。這是怎麼做到的呢?答案是使用了文件改變通知。

先看一個結構

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章