AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Problem mit ReadDirectoryChangesW
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit ReadDirectoryChangesW

Ein Thema von Shark99 · begonnen am 30. Mär 2010 · letzter Beitrag vom 30. Mär 2010
Antwort Antwort
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#1

Problem mit ReadDirectoryChangesW

  Alt 30. Mär 2010, 08:15
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!
  Mit Zitat antworten Zitat
Benutzerbild von spaxxn
spaxxn

Registriert seit: 19. Nov 2004
253 Beiträge
 
Delphi XE2 Enterprise
 
#2

Re: Problem mit ReadDirectoryChangesW

  Alt 30. Mär 2010, 08:26
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.
"Hey Süße,
hol mir mal was zu trinken! Du wirst schon wieder hässlich!"

Zitat eines Betrunkenen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.051 Beiträge
 
Delphi 12 Athens
 
#3

Re: Problem mit ReadDirectoryChangesW

  Alt 30. Mär 2010, 08:29
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#4

Re: Problem mit ReadDirectoryChangesW

  Alt 30. Mär 2010, 13:41
@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.
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#5

Re: Problem mit ReadDirectoryChangesW

  Alt 30. Mär 2010, 13:58
p.s.

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:26 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