Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem mit ReadDirectoryChangesW (https://www.delphipraxis.net/149776-problem-mit-readdirectorychangesw.html)

Shark99 30. Mär 2010 07:15


Problem mit ReadDirectoryChangesW
 
Ich nutze Delphi 5 und ReadDirectoryChangesW (http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx) mit dem FILE_NOTIFY_CHANGE_LAST_WRITE Parameter um Änderungen in einem Verzeichnis zu überwachen.

Wenn es eine Änderung gibt bekomme ich eine FILE_NOTIFY_INFORMATION Struktur.

So weit so gut.

Das Problem: Das Event wird mehr als einmal verschickt!

Ich überwache c:\temp

Beispiel 1:

Kopieren von testfile.txt (100 mb) mit Windows Explorer nach c:\temp

Ich bekomme FILE_NOTIFY_INFORMATION 3 (!!) mal nacheinander. 2 mal wenn das Schreiben beginnt und ein drittes mal 5 Sekunden später wenn es endet.

Beispiel 2:

Kopieren von testfile.txt (100 mb) mit Total Commander (Dateimanager) nach c:\temp

Ich bekomme FILE_NOTIFY_INFORMATION 2 (!!) mal nacheinander. 1 mal wenn das Schreiben beginnt und ein zweites mal 5 Sekunden später wenn es endet.

---

Wie soll ich nun wissen wann das kopieren beendet wurde? Die Information dass es gestartet wurde, brauche ich nicht.

Ich kann die Anzahl der Meldungen nicht zählen, da ich z.B. bei Dropbox ein Event bekomme, bei Total Commander zwei und beim Explorer oder Ultraedit drei.

Diese Lösung klappt nicht:

Mit GetFileSecurityW schaue ich nach ob ich mit GENERIC_WRITE das File beschreiben kann. Leider meldet mir Windows, auch WÄHREND des Kopierens dass ich schreiben darf.

Danke für die Hilfe im Voraus!

spaxxn 30. Mär 2010 07:26

Re: Problem mit ReadDirectoryChangesW
 
Hatte einst ein ähnliches Problem.

Habe es das auf die "unsaubere" Art gelöst und mir bei jedem Event die Dateigrösse gemerkt und wenn diese sich länger als 2 Sekunden nicht mehr verändert hat, nahm ich an, dass der Kopiervorgang beendet ist.

Dies ist nur ein Workaround und mit Sicherheit nicht der Weisheit letzter Schluss, aber wenns einen ans Ziel bringt. :D

himitsu 30. Mär 2010 07:29

Re: Problem mit ReadDirectoryChangesW
 
Es werden (wohl) bei jedem Zugriff auf die Datei(en) die Events ausgelöst
und nicht erst nachdem alles vorbei ist.

Delphi-Quellcode:
CreateFile
WriteFile
WriteFile
WriteFile
CloseFile
Ich weiß nicht , in wie Weit Windows kurz hintereinander auftretende Ereignisse schon vorfiltert, aber hier können bis zu 3 Änderungsmitteilungen auftreten.

GetFileSecurity sagt nur, daß du, laut den Sicherheitseinstellungen, die Rechte hast da zu schreiben. Ob die Datei durch einen anderen Prozeß im Zugriff steht und diese dier über die Sharing-Rechte der Zugriff verwehrt wird, wird da nicht beachtet.
Hier im Forum suchenIsFileInUse


PS: Genau diese Frage taucht hier öfters auf und auch vor Kurzem war das wieder mal der Fall
und immer wieder werden Lösungen genannt.
Hier im Forum suchenReadDirectoryChangesW

Jaja, hier schlägt wieder mal die Längenbegrenzung des ForumSuchIndize zu, aber es gibt ja noch andere Wege.
- andere Suchwörter (dieses bot sich nur an, weil es oftmals auch in diesen Threads erwähnt wird)
- andere Suchmaschienen
[google]ReadDirectoryChangesW site:delphipraxis.net[/google] ... 10 Seiten voller Ergebnisse und gleich die Erste heißt "ReadDirectoryChangesW wird mehrfach ausgelöst. Warum?"
Delphi-Referenz durchsuchenReadDirectoryChangesW (oben rechts auf "DelphiPRAXiS" umschalten)

Shark99 30. Mär 2010 12:41

Re: Problem mit ReadDirectoryChangesW
 
@himitsu

Ich werde mal nach IsFileInUse suchen.

Bevor ich den Beitrag schrieb hab ich die Suchfunktion benutzt und nach ReadDirectoryChangesW gesucht. Etwa 50 Beiträge gelesen und es war nicht eine auch nur halbwegs brauchbare Lösung drin.

@spaxxn

Daran dachte ich auch, aber eine 2 Sekunden Lösung wird hier nicht fuktionieren, da auch noch nach 2 Sekunden ohne Dateigrössenänderung das Kopieren anhalten kann, z.B. durch Caches oder weil es aus dem Internet kommt (Dropbox) und die Verbindung stockt.

Shark99 30. Mär 2010 12:58

Re: Problem mit ReadDirectoryChangesW
 
p.s.

IsFileInUse ist keine Lösung weil beim letzten verschickten Event die Datei in Benutzung ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz