Solved

ReadDirectoryChangesW

Posted on 1998-11-20
6
1,346 Views
Last Modified: 2013-11-20
My application watches for change in specific file using ReadDirectoryChangesW Windows NT API function. Changes include file creation and last write. I user OVERLAPPED structure woth non signalled event. The structure is passed to ReadDirectoryChangesW function which immediately returns. Then I wait on event using WaitForSingleObject. When change in waching directory occurs ReadDirectoryChangesW signals event and WaitForSingleObject exits blocking state. Then I reset event and restart watch.
My problem is second time after I reset event ReadDirectoryChangesW immediately returns signaling event so I get two changes in the same file with the same parameters despite only one actual chnage (i.e. file was added to the directory) occured.
Could some one explain to me why ReadDirectoryChangesW notifies about file change twice?
0
Comment
Question by:galkin
  • 3
  • 2
6 Comments
 
LVL 86

Expert Comment

by:jkr
ID: 1325050
I assume that the first notification is due to the 'file was added to directory' incident, whilst the second notification is related to the 'last time modified changed' incident for the directory itself...
0
 
LVL 7

Author Comment

by:galkin
ID: 1325051
Maybe, but I am actually interested in getting one notification, namely last write to file if it exists or creating file if it does not. Action filed of FILE_NOTIFY_INFORMATION structure has FILE_ACTION_MOFIFIED value in both cases. I need somehow to distinguish and omit case when time stamp chnaged.
0
 
LVL 3

Accepted Solution

by:
vinniew earned 200 total points
ID: 1325052
The problem is in the way ReadDirectoryChanges works underneath.  The NtCreateFile() function (in NTDLL.DLL) gets called twice and triggers it.
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 3

Expert Comment

by:vinniew
ID: 1325053
Here are the flags for that api...

                                    FILE_NOTIFY_CHANGE_FILE_NAME      |      // filter conditions to watch for
                                          FILE_NOTIFY_CHANGE_DIR_NAME            |
                                          FILE_NOTIFY_CHANGE_ATTRIBUTES      |
                                          FILE_NOTIFY_CHANGE_SIZE                  |
                                          FILE_NOTIFY_CHANGE_LAST_WRITE      |
                                          FILE_NOTIFY_CHANGE_LAST_ACCESS      |
                                          FILE_NOTIFY_CHANGE_CREATION            |
                                          FILE_NOTIFY_CHANGE_SECURITY,



If you want to get file creation - specific notification, you can call readdirectorychanges multiple times, once for the notification of creation and once for the others, and use the event handle in WaitForMultipleObjects()... The event that triggers is the one that will have the notification you want.  E-mail your readdirectorychanges snippet to me and I can code what I'm talking about...
0
 
LVL 7

Author Comment

by:galkin
ID: 1325054
Thank's for explanation. But i need to folter only one call. My another problem with ReadDirectoryChangesW is that it locks directory. I try from Explorer to duplicate file using copy/paste in directory wached but I have an error "Sharing valuation. Source or target may be in use"
0
 
LVL 7

Author Comment

by:galkin
ID: 1325055
The problem  is ReadDirectoryChangesW with FILE_NOTIFY_CHANGE_LAST_WRITE notifies twice about change and there is no way do distinguish between chnage for instance in last write and time stampt as they are reffered in the same FILE_ACTION_MOFIFIED bit.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
sumDigits challenge 9 125
dog bark java program 15 87
while loop over for loop 7 93
changeXy challenge 13 67
Introduction: Dynamic window placements and drawing on a form, simple usage of windows registry as a storage place for information. Continuing from the first article about sudoku.  There we have designed the application and put a lot of user int…
Have you tried to learn about Unicode, UTF-8, and multibyte text encoding and all the articles are just too "academic" or too technical? This article aims to make the whole topic easy for just about anyone to understand.
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
Internet Business Fax to Email Made Easy - With  eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, f…

867 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now