Monitor a directory using WaitForMultipleObjects
Platform : Windows2000, XP,
Microsoft Visual C++ .NET (Version 7.1),
Hello,
I need to process the files in a directory immediately the moment it gets
deposited in a directory.
I am trying to achieve this by running WaitForMultipleObjects ,
FindFirstChangeNotificationAPI, FindNextChangeNotification in a While loop
in the Run() of one of my worker threads of my multithread application.
I get the events for the files that were deposited after the
WaitForMultipleObjects was invoked in the while loop.
However those files that get deposited in the folder in the split of second
before the WaitForMultipleObjects is invoked are not getting reported i.e. I
am not getting their handles.
Is there any other API or code that can help em achieve the same without
losing the notification of the files deposited?
Any eveident problem that you see as to why this should happen?
Any poitners would be of great help
Thanks and Regards
Ganga
(Please see excerpts of code below:)
int CMyWorkThread::Run()
{
ASSERT_VALID(GetWork());
CDirEventReceiverWork* dirWrk =
dynamic_cast<CDirEventReceiverWork*>(GetWork());
try
{
DWORD timeout = GetCycleTime();
BOOL waitAll = FALSE;
DWORD dwWaitStatus;
while (TRUE)
{
try
{
dirWrk->GetEventDirectoryList(con);
dwChangeHandle= FindFirstChangeNotification( lpDir, // directory to watch
subDirState, // do not watch subtree
FILE_NOTIFY_CHANGE_CREATION |FILE_NOTIFY_CHANGE_LAST_WRITE); // watch file
name changes
AddToHandleMap(dwChangeHandle, &ci);
dwChangeHandles = GetHandleList();
int nHandles = m_pDirEventServer.GetHandleMap().size()+ 2;
dwWaitStatus = WaitForMultipleObjects(nHandles, dwChangeHandles,
waitAll, timeout);
if(dwWaitStatus == WAIT_TIMEOUT )
{
//Refresh receiver list
continue;
}
if((dwWaitStatus == WAIT_OBJECT_0 + 0) || (dwWaitStatus == WAIT_OBJECT_0 +
1) )
{
//signalled kill event
break;
}
if((dwWaitStatus <= (WAIT_OBJECT_0 +1)) || (dwWaitStatus >= nHandles))
{
ASSERT(false);
ostringstream ost;
ost << "Invalid wait return value [" << dwWaitStatus << "]";
CABIException(PROGRAM_ERROR, ost.str(), __FILE__, __LINE__);
continue;
}
if(dwWaitStatus == m_pDirEventServer.GetHandleMap().size())
{
//signalled kill event
break;
}
//Process the files
}
......................