FindFirstChangeNotification锁定父文件夹 [英] FindFirstChangeNotification locks parent folder
问题描述
我正在使用FindFirstChangeNotification()/ReadDirectoryChangesW()来监视文件夹中的更改.它按预期工作.我的问题是:当我尝试重命名Watched文件夹的父级时,访问被拒绝,错误5.我猜测我的FCN句柄已打开该文件夹以进行通知监视,并且不允许更改父级.
I'm using FindFirstChangeNotification()/ReadDirectoryChangesW() to watch a folder for changes. It's working as expected. My Question is: When I try to rename the parent of the Watched folder, I get access denied, error 5. I'm guessing my FCN handle has the folder open for notification monitoring and changing the parent is not allowed.
有什么方法可以监视子目录,例如c:\ folder \ subfolder \ anotherfolder \,并且仍然能够打开命令提示符(或其他程序)并执行重命名c:\ folder \ c:\ folder2" "
Is there any way to monitor a subdirectory, say c:\folder\subfolder\anotherfolder\ and still be able to open a command prompt (or other program) and execute a "rename c:\folder\ c:\folder2"
这是我的代码段
//
// 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
}
}
推荐答案
不确定是否正是您所需要的
Not sure if that's what you need,
如果您希望在将当前侦听器保留在 c:\ folder \ subfolder \ anotherfolder \ 中的同时侦听ANOTHER路径,则将需要一个HANDLE
类型的数组.
If you are interested in listening to ANOTHER path while maintaining your current listener in c:\folder\subfolder\anotherfolder\, you will need an array of HANDLE
types.
在您的代码中它将如下所示:
In your code it will look like this:
HANDLE m_hChangeHandle[x];// int x should be the quantity of your desired listeners.
当然,您需要为每个数组使用FindFirstChangeNotification
,即:
Of course you need to use FindFirstChangeNotification
for each of your array, ie:
m_hChangeHandle[0] = FindFirstChangeNotification(..., ..., ...);
m_hChangeHandle[1] = FindFirstChangeNotification(..., ..., ...);
//and so on..
由于您现在使用的侦听器数量已超过1,因此您无法继续使用WaitForSingleObject
,而是使用
Since you are using now more then 1 listener you can't keep using WaitForSingleObject
but rather WaitForMultipleObjects. i.e:
WaitForMultipleObjects(x, m_hChangeHandle, FALSE, INFINITE);//False will wait for a change in at least one of the listeners.
希望这就是您所需要的.
Hope it's what you needed.
这篇关于FindFirstChangeNotification锁定父文件夹的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!