![]() |
Problem mit ReadDirectoryChangesW
Ich nutze Delphi 5 und ReadDirectoryChangesW (
![]() 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! |
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 |
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:
Ich weiß nicht , in wie Weit Windows kurz hintereinander auftretende Ereignisse schon vorfiltert, aber hier können bis zu 3 Änderungsmitteilungen auftreten.
CreateFile
WriteFile WriteFile WriteFile CloseFile 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. ![]() 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. ![]() 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?" ![]() |
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. |
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 22:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz