Monitor a directory using WaitForMultipleObjects
Platform : Windows2000, XP,
Microsoft Visual C++ .NET (Version 7.1)
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
When I use dos command copy in batch file for copying file from
one folder to other
then my application reads from the destination directory smoothly.
But when I use move command, file moved from one directory to another
but my aplication does not read the file from the directory.
(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
}
Any suggestion or solution will be the great help for me.
Regards
Alok Mahto