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 Verzeichnis überwachen - ReadDirectoryChangesW (https://www.delphipraxis.net/173627-verzeichnis-ueberwachen-readdirectorychangesw.html)

Cyberaxx 7. Mär 2013 11:47

Verzeichnis überwachen - ReadDirectoryChangesW
 
Hallo Community,

ich würde gerne ein Verzeichnis überwachen mittels ReadDirectoryChangesW. Habe hier auch schon einiges gefunden und zuletzt auch eine fertige Unit von Luckie & Christian. Es handelt sich um die Unit MpuReadDirectoryChangesCls.

Habe ein kleines Projekt erstellt welches mit ein Latex Verzeichnis überwachen soll. Inhalt 117 Dateien, wird nun eine Datei geändert läuft das Programm auch soweit Problemlos durch. Erzeuge ich nun allerdings meine PDF Datei, so wird ein Großteil der Dateien geändert. Es wird mir auch anfangs angezeigt bis es sich dann mit einer Zugriffsverletzung verabschiedet.

Natürlich jetzt wenn ich die Fehlermeldung brauche, dann läuft es einmal brav durch...
Nach dem driten durchgang aber kommt auch schon die nette Fehlermeldung.
Zitat:

Im Projekt Project2.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 00404401 in Modul 'Project2.exe'. Lesen von Adresse 02E211F6' aufgetreten.
Trotz fortsetzen bleibt die Form verschwunden. Zusätzlich darf ich den Thread auch nicht beenden. dann bekomme ich schon die nächste Meldung. Ich rufe hier nur csDirThread.Terminate auf
Zitat:

Exception EExternalException in Modul Project2.exe bei 772002F7.
Externe Exception C0000008.
Gerne erhalte ich auch mal unschöne Auswertungen von Filename und Reason. Diese kommen aber auch nicht immer.

Zitat:

[07.03.2013 12:36:05]: Datei wurde verändert -> tengenerator HL\hMODELL.log
[07.03.2013 12:36:05]: Ungültiger Reason Code: 00000000 -> tengenerator HL\hMODELL.texॣ
[07.03.2013 12:36:05]: Datei wurde verändert -> tengenerator HL\hMODELL.texॣ
[07.03.2013 12:36:05]: Datei wurde verändert -> tengenerator HL\hMODELL.tex
[07.03.2013 12:36:04]: Datei wurde verändert -> tengenerator HL
[07.03.2013 12:36:04]: Ungültiger Reason Code: 00000000 -> tengenerator HL\hMODELL.synctex.gz(busy)
[07.03.2013 12:36:04]: Datei wurde verändert -> tengenerator HL\hMODELL.synctex.gz(busy)
[07.03.2013 12:36:04]: Datei wurde verändert -> tengenerator HL\hMODELL.pdf
[07.03.2013 12:36:04]: Datei wurde verändert -> tengenerator HL
[07.03.2013 12:36:04]: Datei wurde verändert -> tengenerator HL
[07.03.2013 12:36:04]: Datei wurde verändert -> tengenerator HL\hMODELL.log
[07.03.2013 12:36:04]: Ungültiger Reason Code: 00000000 -> tengenerator HL\hMODELL.texÿ
[07.03.2013 12:36:04]: Datei wurde verändert -> tengenerator HL\hMODELL.texÿ
[07.03.2013 12:36:04]: Datei wurde verändert -> tengenerator HL\hMODELL.tex
[07.03.2013 12:36:02]: Datei wurde verändert -> tengenerator HL
[07.03.2013 12:36:02]: Ungültiger Reason Code: 00000000 -> tengenerator HL\hMODELL.synctex.gz(busy)
[07.03.2013 12:36:02]: Datei wurde verändert -> tengenerator HL\hMODELL.synctex.gz(busy)
[07.03.2013 12:36:02]: Datei wurde verändert -> tengenerator HL\hMODELL.pdf
[07.03.2013 12:36:01]: Datei wurde verändert -> tengenerator HL
[07.03.2013 12:36:01]: Datei wurde verändert -> tengenerator HL
[07.03.2013 12:36:01]: Datei wurde verändert -> tengenerator HL\hMODELL.log
[07.03.2013 12:36:01]: Ungültiger Reason Code: 00000000 -> tengenerator HL\hMODELL.tex
[07.03.2013 12:36:01]: Datei wurde verändert -> tengenerator HL\hMODELL.tex
[07.03.2013 12:36:01]: Datei wurde verändert -> tengenerator HL\hMODELL.tex
[07.03.2013 12:35:58]: Datei wurde verändert -> tengenerator HL
[07.03.2013 12:35:58]: Ungültiger Reason Code: 00000000 -> tengenerator HL\hMODELL.synctex.gz(busy)
Jetzt muss ich noch feststellen das hier Teile des Pfades bereits fehlen. es Sollte heißen Variantengenerator HL.

Gestartet wird es folgendermaßen:
Delphi-Quellcode:
  sMemo1.Lines.Clear;
  if DirectoryExists(sEdit1.Text) then
  begin
    if csDirThread = nil then
    begin
      WriteLog('Überwachung startet...');
      csDirThread := TcsDirThread.Create(sEdit1.Text);
      csDirThread.OnDirectoryChanges := csDirThreadDirectoryChanges;
      csDirThread.OnDirectoryChangesError := csDirThreadDirectoryChangesError;
      csDirThread.OnTerminate := csDirThreadTerminate;
    end
    else
      WriteLog('Thread existiert noch');
  end
  else
    WriteLog('Verzeichnis existiert nicht');
Stoppen so:
Delphi-Quellcode:
  if csDirThread <> nil then
  begin
    csDirThread.Terminate;
    //FreeAndNil(csDirThread);
  end;
Delphi 2010 Pro
Windows 7 64Bit

Cyberaxx 8. Mär 2013 14:03

AW: Verzeichnis überwachen - ReadDirectoryChangesW
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal der Quelltext den ich derzeit einsetze. Die Klasse von Luckie & Christian ist enthalten. Ansonsten nur jvSelectDirectory, Rest ist Standard.

Sorry hier hat sich ein kleiner Fehler eingeschlichen in der Unit3.pas Zeile 73 muss das s von sedit entfernt werden

Luckie 9. Mär 2013 00:25

AW: Verzeichnis überwachen - ReadDirectoryChangesW
 
http://michael-puff.de/Programmierung/Delphi/Units/

doctor-x 9. Mär 2013 08:39

AW: Verzeichnis überwachen - ReadDirectoryChangesW
 
Hi,

e.v. mal mit http://www.delphipraxis.net/165565-t...rychanges.html versuchen.

Hatte mit ReadDirectoryChanges auch mal etliche komische Verhaltensweisen.

MfG

Cyberaxx 9. Mär 2013 08:59

AW: Verzeichnis überwachen - ReadDirectoryChangesW
 
@Luckie: Das ist doch genau die Dateiversion die ich aktuell nutze und mit der es nicht funktioniert.

@doctor-x: Danke werd ich mir gleich mal ansehen

Luckie 9. Mär 2013 10:04

AW: Verzeichnis überwachen - ReadDirectoryChangesW
 
Ach das ist mein Demo? Ok. Dann könnte es daran liegen, dass ich das damals noch mit einer älteren Delphi Version geschrieben habe. Ich hatte damit keine Probleme.

Cyberaxx 9. Mär 2013 10:22

AW: Verzeichnis überwachen - ReadDirectoryChangesW
 
Steht im übrigen im Eröffnungspost :)

Ich hab es selbst auf Delphi 7 kompiliert unter WinXP gestern Abend aber da knallt es schon direkt bei der ersten Änderung im Verzeichnis.
Habe da sonst kein Kram dran gebaut es ist nur das starten des Threads.

Cyberaxx 9. Mär 2013 20:07

AW: Verzeichnis überwachen - ReadDirectoryChangesW
 
Danke doctor-x die Komponente erzeugt zumindest keine Fehler bisher.

Bei einer Dateiänderung wird jedoch das Event "Modified" 2 mal aufgerufen. Konnte ich bei Lukies Klasse nicht feststellen.


Es geht darum das ich gerne ein Programm hätte was wie Dropbox funktioniert. Ich dachte das ich dies mit Hilfe dieser Funktion aufbauen kann.
Wenn allerdings bei einem erzeugen einer Datei 5 mal das Event aufgerufen wird denke ich wirds doch schwer diese direkt hochzuladen.

Weiß jemand wie die Dropbox das beispielsweise löst?

Christian Seehase 10. Mär 2013 00:02

AW: Verzeichnis überwachen - ReadDirectoryChangesW
 
Moin Daniel,

Zitat:

Zitat von Cyberaxx (Beitrag 1206657)
Bei einer Dateiänderung wird jedoch das Event "Modified" 2 mal aufgerufen. Konnte ich bei Lukies Klasse nicht feststellen.

Das doppelte Auslösen des Events scheint ein prinzipielles Verhalten von ReadDirectoryChangesW zu sein, dass wir hier im Forum schon öfter diskutiert haben (leider ohne Lösung :wink:)
Ich vermute mal, dass Luckie dafür einen Workaround eingebaut hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 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