We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

ReadDirectoryChangesW

galkin
galkin asked
on
Medium Priority
1,667 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?
Comment
Watch Question

jkr
CERTIFIED EXPERT
Top Expert 2012

Commented:
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...

Author

Commented:
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.
Commented:
Unlock this solution and get a sample of our free trial.
(No credit card required)
UNLOCK SOLUTION

Commented:
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...

Author

Commented:
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"

Author

Commented:
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.
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a sample view!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.