AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) FindFirstChangeNotifikation vs. ReadDirectoryChangesW vs. SHChangNoitifyRegister

FindFirstChangeNotifikation vs. ReadDirectoryChangesW vs. SHChangNoitifyRegister

Ein Thema von Rollo62 · begonnen am 7. Nov 2017 · letzter Beitrag vom 8. Nov 2017
Antwort Antwort
Seite 1 von 2  1 2   
Rollo62
Online

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#1

FindFirstChangeNotifikation vs. ReadDirectoryChangesW vs. SHChangNoitifyRegister

  Alt 7. Nov 2017, 21:25
Hallo zusammen,

ich habe schonmal FindFirstChangeNotifikation mit C++ für das Überwachen von Directories und Files eingesetzt.
Funktionierte ganz OK.
(Also neue Files melden, Löschen melden, umbenennen, o.ä. melden ohne Polling).
http://www.delphipraxis.net/152046-f...anstossen.html

Jetzt bräuchte ich das wieder, und ich checke gerade was es da so Alles gibt.
Dafür gibt es auch eine Lösung mit ReadDirectoryChangesW.
http://forum.codecall.net/topic/7631...r-for-changes/

Welches ist denn "moderner" oder was für Vor- Nachteile gibt es da zwischen den Beiden ?
Die scheinen erstmal ziemlich das Gleiche zu machen.

Mit FindFirstChangeNotifikation war ich ganz zufrieden seinerzeit, auch weil es mit einem WaitForMultipleObjects effizient arbeiten kann.

Das ReadDirectoryChangesW habe ich jetzt nur kurz gecheckt, läuft auch, aber da fehlt offenbar ein Wait im Thread.
Das ReadDirectoryChangesW scheint selbst blockend zu sein, und in der Funktion ein Wait zu setzen.
Beim Beenden des Demos gibt es dann MemoryLeaks.

Wie kann man das ReadDirectoryChangesW abbrechen, um den Thread sauber zu Beenden, ein Timeout scheint es nicht zu geben.

ReadDirectoryChangesW oder FindFirstChangeNotifikation , was sollte man Nutzen ?


Update:
Ok, ich sehe gerade da kann man was über https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx machen kann,
und doch Sync oder Async arbeiten.
Das Demo oben hat anscheinend nur den synchronen Code drin, ohne Overlapping.

Es scheint hier noch eine weitere Möglichkeit zu geben mit SHChangeNotifyRegister.

Die Fragen bleiben:
- Was sind Vor- Nachteile / Unterschiede
- Welche sollte man nehmen für das Überwachen ob Files erzeugt oder gelöscht werden ?
- Welche Version ist am zukunftssichersten ?

Vieleicht hat ja jemand damit schon mehr Erfahrungen damit gemacht ?

Rollo

Geändert von Rollo62 ( 8. Nov 2017 um 07:05 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: FindFirstChangeNotifikation vs. ReadDirectoryChangesW vs. SHChangNoitifyRegister

  Alt 8. Nov 2017, 09:14
Hallo zusammen,

ich habe schonmal FindFirstChangeNotifikation mit C++ für das Überwachen von Directories und Files eingesetzt.
Funktionierte ganz OK.
(Also neue Files melden, Löschen melden, umbenennen, o.ä. melden ohne Polling).
http://www.delphipraxis.net/152046-f...anstossen.html

Jetzt bräuchte ich das wieder, und ich checke gerade was es da so Alles gibt.
Dafür gibt es auch eine Lösung mit ReadDirectoryChangesW.
http://forum.codecall.net/topic/7631...r-for-changes/

Welches ist denn "moderner" oder was für Vor- Nachteile gibt es da zwischen den Beiden ?
Die scheinen erstmal ziemlich das Gleiche zu machen.
Im ersten Link heißt es:
"To retrieve information about the specific change as part of the notification, use the ReadDirectoryChangesW function. This function also enables you to provide a completion routine."
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#3

AW: FindFirstChangeNotifikation vs. ReadDirectoryChangesW vs. SHChangNoitifyRegister

  Alt 8. Nov 2017, 09:16
Vielleicht kannst du ja hiermit was anfangen. Genutzt wird ReadDirectoryChangesW.
https://github.com/HeidiSQL/HeidiSQL...ctoryWatch.pas
  Mit Zitat antworten Zitat
Rollo62
Online

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#4

AW: FindFirstChangeNotifikation vs. ReadDirectoryChangesW vs. SHChangNoitifyRegister

  Alt 8. Nov 2017, 10:30
Hallo Glados,

vielen Dank für den Link, Heidi ist ja komplett mit Overlapped und Wait.
Das sollte helfen das Blockieren zu verhindern.

@TiGü
Danke auch, ich denke die Funktionen hängen Alle irgendwie zusammen.
Ich brauche aber nichts erweitertes (zumindest im Moment), und ich weiss das der FirstChange.. schon ausreicht.

Die Frage bleibt was ist denn jetzt der beste und effizienteste Weg ?
(die Qual der Wahl).

Ich denke ich probier jetzt auch noch die Heidi-Lösung von Glados aus, und melde mich was damit passiert ...

Rollo
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#5

AW: FindFirstChangeNotifikation vs. ReadDirectoryChangesW vs. SHChangNoitifyRegister

  Alt 8. Nov 2017, 10:41
Zitat:
Ich denke ich probier jetzt auch noch die Heidi-Lösung von Glados aus, und melde mich was damit passiert ...
Man braucht nur diese eine Unit zum Glück.

Geändert von Glados ( 8. Nov 2017 um 11:07 Uhr)
  Mit Zitat antworten Zitat
Rollo62
Online

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#6

AW: FindFirstChangeNotifikation vs. ReadDirectoryChangesW vs. SHChangNoitifyRegister

  Alt 8. Nov 2017, 11:20
Hallo Glados,

ja das funktionier super.
Im Gegensatz zu den anderen Lösungen bekomme ich auch alle Verschiebe-Operationen etc. mit.
Ok, brauche ich eigentlich nicht, aber wenn schon dann schon.

Die Unit ist wohl Teil der CromisLibrary von Iztok Kacin, aber die Site www.cromis.net scheint leider nicht mehr zu existieren.

Zum Glück hatte ich noch eine komplette Library, da muss ich dann nochmal näher reinschauen.

Danke nochmal für den Tipp.

Rollo
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#7

AW: FindFirstChangeNotifikation vs. ReadDirectoryChangesW vs. SHChangNoitifyRegister

  Alt 8. Nov 2017, 11:28
Ich merke gerade, dass meine Unit der DirectoryWatch um einiges anders aussieht als die Version bei Github.
Da ich meine Unit erst seit 2012 nutze denke ich, dass sie neuer ist. Wo auch immer ich die gefunden habe.

Beispielsweise lautet in Execute eine Zeile bei mir
Delphi-Quellcode:
procedure TDirWatchThread.Execute;
...
if ReadDirectoryChangesW(FDirHandle, FIOResult, IO_BUFFER_LEN, FWatchSubTree, FFilter, @ResSize, @Overlap, nil) then
 begin
  WaitResult := WaitForMultipleObjects(2, @Events[0], False, INFINITE);

Bei Github
Delphi-Quellcode:
procedure TDirWatchThread.Execute;
...
if ReadDirectoryChangesW(FDirHandle, FIOResult, FBufferSize, FWatchSubtree, FFilter, @ResSize, @Overlap, nil) then
 begin
  WaitResult := WaitForMultipleObjects(Length(Events), @Events, FALSE, INFINITE);
BeyondCompare zeigt mir 61 unterschiedliche Abschnitte.

Geändert von Glados ( 8. Nov 2017 um 11:32 Uhr)
  Mit Zitat antworten Zitat
Rollo62
Online

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#8

AW: FindFirstChangeNotifikation vs. ReadDirectoryChangesW vs. SHChangNoitifyRegister

  Alt 8. Nov 2017, 12:05
Ich habe die 2te Variante, Änderungsdaten von 2011 bis 2014.
Copyright ist von 2009, scheint überall gleich zu sein.

Ich weiss leider nicht mehr wo ich das herhabe.

Rollo
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#9

AW: FindFirstChangeNotifikation vs. ReadDirectoryChangesW vs. SHChangNoitifyRegister

  Alt 8. Nov 2017, 12:26
Könntest du mir diese Unit zum Vergleich zur Verfügung stellen?

Meine Unit scheint dann doch älter zu sein. Eine neuere finde ich nicht. Meine ist außerdem von mir um ein paar Properties erweitert worden (eine wichtige Funktionalität mehr).
  Mit Zitat antworten Zitat
Rollo62
Online

Registriert seit: 15. Mär 2007
3.882 Beiträge
 
Delphi 12 Athens
 
#10

AW: FindFirstChangeNotifikation vs. ReadDirectoryChangesW vs. SHChangNoitifyRegister

  Alt 8. Nov 2017, 12:34
Hallo Glados,

ein Problem hatte die Unit aber, wenn man das Base directory selbst entfernt läuft der Thread wild.
Das kann man aber leicht beheben:

Delphi-Quellcode:
        begin
          ErrorMessage := SysErrorMessage(GetLastError);
          SignalError(ErrorMessage);

          Terminate; //S4: Added 08.11.17: Prevent endless loop when removing base directory
          Exit;
        end;
      end;
    end
    else
    begin
      ErrorMessage := SysErrorMessage(GetLastError);
      SignalError(ErrorMessage);
    end;
Ich kann dir die Unit zuschicken.

Rollo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 11:24 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