Solved

ReadDirectoryChangesW

Posted on 1998-11-20
6
1,353 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
Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

 
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

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

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

Suggested Solutions

Introduction: Displaying information on the statusbar.   Continuing from the third article about sudoku.   Open the project in visual studio. Status bar – let’s display the timestamp there.  We need to get the timestamp from the document s…
If you use Adobe Reader X it is possible you can't open OLE PDF documents in the standard. The reason is the 'save box mode' in adobe reader X. Many people think the protected Mode of adobe reader x is only to stop the write access. But this fe…
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.
Migrating to Microsoft Office 365 is becoming increasingly popular for organizations both large and small. If you have made the leap to Microsoft’s cloud platform, you know that you will need to create a corporate email signature for your Office 365…

813 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

15 Experts available now in Live!

Get 1:1 Help Now