2015-01-15 69 views
2

我正在使用FindFirstChangeNotification()/ ReadDirectoryChangesW()來查看文件夾的更改。它按預期工作。我的問題是:當我嘗試重命名監視文件夾的父級時,我得到訪問被拒絕,錯誤5。我猜我的FCN句柄已打開文件夾以進行通知監視,並且不允許更改父級。FindFirstChangeNotification鎖定父文件夾

有沒有什麼辦法來監視一個子目錄,比如c:\ folder \ subfolder \ anotherfolder \,並且仍然能夠打開命令提示符(或其他程序)並執行「rename c:\ folder \ c:\文件夾2"

這裏是我的代碼片段

// 
    // Sign up for notifications on the object. 
    // 
    m_bWatchSubTree = TRUE; 
    m_dwWatchFlags = 
     FILE_NOTIFY_CHANGE_SECURITY |  // (0x100) change to security descriptor (NTFSACL?) 
     FILE_NOTIFY_CHANGE_CREATION |  // (0x40) change to creation date 
     FILE_NOTIFY_CHANGE_LAST_ACCESS | // (0x20) change to last access date 
     FILE_NOTIFY_CHANGE_LAST_WRITE |  // (0x10) any change to the modification date/time of file in the folder 
     FILE_NOTIFY_CHANGE_SIZE |   // (0x08) Size changed 
     FILE_NOTIFY_CHANGE_ATTRIBUTES |  // (0x04) Atributes of something changed 
     FILE_NOTIFY_CHANGE_DIR_NAME |  // (0x02) DIR name change in watched folder rename,create,delete FOLDER 
     FILE_NOTIFY_CHANGE_FILE_NAME;  // (0x01) FILE name change in watched folder. rename,create,delete FILE 

    CString strObjectPathAndName(_T("c:\\folder\\subfolder\\anotherfolder\\"); 
    m_hChangeHandle = ::FindFirstChangeNotification(strObjectPathAndName, m_bWatchSubTree, m_dwWatchFlags); 
    if (m_hChangeHandle != INVALID_HANDLE_VALUE) 
    { 
     DWORD dwStatus = ::WaitForSingleObject(m_hChangeHandle, INFINITE); 
     HANDLE hDir = ::CreateFile(strObjectPathAndName, 
           FILE_LIST_DIRECTORY, 
           FILE_SHARE_READ | FILE_SHARE_WRITE| FILE_SHARE_DELETE, 
           NULL, //security attributes 
           OPEN_EXISTING, 
           FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,   
           NULL); 
     DWORD dwBytesReturned = 0; 
     FILE_NOTIFY_INFORMATION *p = (FILE_NOTIFY_INFORMATION*)nb.GetBuffer(); 
     if (::ReadDirectoryChangesW(hDir, p, nb.GetMaxSize(), m_bWatchSubTree, m_dwWatchFlags, &dwBytesReturned, NULL, NULL)) 
     { 
     // 
     // do some stuff 
     } 
    } 

回答

0

不知道,如果這是你需要什麼,

如果你有興趣聽另一條路徑,同時保持當前的聽衆在C:\文件夾\子文件夾\另一個文件夾\,您將需要一個HANDLE類型的數組。

在你的代碼,它看起來就像這樣:

HANDLE m_hChangeHandle[x];// int x should be the quantity of your desired listeners. 

當然,你需要使用FindFirstChangeNotification爲每個陣列,即:

m_hChangeHandle[0] = FindFirstChangeNotification(..., ..., ...); 
m_hChangeHandle[1] = FindFirstChangeNotification(..., ..., ...); 
//and so on.. 

由於您使用現在更多的則1聽衆,你不能繼續使用WaitForSingleObject而是WaitForMultipleObjects。即:

WaitForMultipleObjects(x, m_hChangeHandle, FALSE, INFINITE);//False will wait for a change in at least one of the listeners. 

希望這是你所需要的。

+0

嗨,感謝您的輸入,但不,我不想監視一個不同的文件夾。當子文件夾是更改通知觀察者的目標時,我特別需要重命名子文件夾的父文件夾。 我的解決方法是始終在頂層進行偵聽,並忽略任何超出我需要範圍的更改通知。 – WebDrive

+0

但是,爲什麼不只是聽你需要的實際子文件夾,如你所說,如果更改將發生重命名其父文件夾。除非我不正確地理解用例 – OhadM