Einzelnen Beitrag anzeigen

Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#1

Verzeichnis überwachen - ReadDirectoryChangesW

  Alt 7. Mär 2013, 11:47
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
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat