Board index » Visual Studio » Monitor a directory using WaitForMultipleObjects

Monitor a directory using WaitForMultipleObjects

Visual Studio293
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


-
 

Re:Monitor a directory using WaitForMultipleObjects



<alokmahto2007@gmail.com>wrote in message

Quote


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.



Move doesn't create a new file.... you need to watch for

FILE_NOTIFY_CHANGE_FILE_NAME as well.



Quote


(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







-

Re:Monitor a directory using WaitForMultipleObjects

||

=============================================================================||



Hi Ben Voigt

After using FILE_NOTIFY_CHANGE_FILE_NAME this line in My project It

is working fine.

Thanks for this great help

Regards

Alok Mahto



||

=============================================================================||

On Mar 21, 9:06 am, "Ben Voigt" <r...@nospam.nospam>wrote:

Quote
<alokmahto2...@gmail.com>wrote in message



news:1174491590.597406.231050@e1g2000hsg.googlegroups.com...















>Platform : Windows2000, XP,



>Microsoft Visual C++ .NET (Version 7.1)



>I need to process the files in adirectoryimmediately the moment it

>gets

>deposited in adirectory.

>I am trying to achieve this by runningWaitForMultipleObjects,

>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 destinationdirectorysmoothly.



>But when I use move command, file moved from onedirectoryto another

>but my aplication does not read the file from thedirectory.



Move doesn't create a new file.... you need to watch for

FILE_NOTIFY_CHANGE_FILE_NAME as well.











>(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, //directoryto

>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- Hide quoted text -



- Show quoted text -- Hide quoted text -



- Show quoted text -





-