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