![]() |
Zugriffsfehler bei Ordnerüberwachung
Hallo Delphi-Freunde!
Seit langem hab ich mal wieder ein Problem, wo ich noch keine Lösung bzw. Workaround gefunden habe. Ich schreibe z.Z. ein Programm, welches verschiedene Ordner auf der Festplatte überwacht. Wenn bestimmt Dateien geändert, neu erstellt oder gelöscht werden, erkennt mein Programm das. Daraufhin öffnet das Programm die Dateien und ließt alle Informationen (Daten) neu aus und speichert Sie in einer Datenbank. Nun zum Problem: Wenn Dateien im überwachten Ordner neu angelegt werden, der Kopiervorgang durch Windows jedoch noch nicht abgeschlossen ist, versucht mein Programm bereits auf die Dateien zuzugreifen und bekommt wie zu erwarten eine Exception (E/A Fehler 32). folgende 2 Möglichkeiten hab ich mir bereits überlegt: - Das Programm versucht solange auf die Datei zuzugreifen, bis es erfolgreich ist. Die Folgen sind eine 100% CPU-Auslastung und eine Blockierung meines Programms. :evil: - Mittels der API-Funktion "UnLockFile" trotz Sperre die Datei zu öffnen. (noch nicht ausprobiert) Die Wahrscheinlichkeit ist aber hoch, dass die auszulesenden Daten noch gar nicht kopiert wurden --> kein Zugriff Ich suche eine Möglichkeit solange zu warten, bis die Datei fertig kopiert wurde, jedoch ohne 100% CPU-Auslastung und Programmblockierung. Ich hoffe Ihr könnt mir helfen. :angel: Mfg Moyyer |
Re: Zugriffsfehler bei Ordnerüberwachung
Wie wäre is mit folgender Idee: du überwachst den Ordner weiterhin wie gehabt. Sobald dann eine neue Datei erstellt wird, versuchst du aber nicht sofort, diese auszulesen sondern fügst einen Eintrag in eine Liste hinzu. So ein Eintrag könnte z.B. sein:
Delphi-Quellcode:
Dieses Record füllst du dann mit den entsprechenden Parametern aus und fügst es wie gesagt in eine Liste hinzu.
type
TFileChangeType = (fctNewFile, fctModfied, fctDeleted); PFileChangeData = ^TFileChangeData; TFileChangeData = record ChangeType : TFileChangeType; // welche Änderung FileName : string; // der komplette Pfad Notified : TDateTime; // Zeitpunkt, an dem der Eintrag in die Liste hinzugefügt wurde end; Diese Liste arbeitest du dann z.B. in einem seperaten Thread ab. Sobald eine Änderung dann erfolgreich in deine Datenbank übertragen wurde, löschst du den Eintrag aus der Liste wieder. Wenn du jetzt z.B. noch nicht auf eine Datei zugreifen kannst, dann schlägt das Hinzufügen ja fehl und der Eintrag wird dann nicht aus der Liste entfernt. Dann wartest du halt etwas (im Thread z.B. mit Sleep) oder arbeitest erstmal andere Einträge ab und probierst es dann nochmal. Das machst du dann solange, bis du geschafft hast. |
Re: Zugriffsfehler bei Ordnerüberwachung
Hi littleDave
Danke für deinen Post. So wie du es beschrieben hast, ist es bei mir bereits zu 90% umgesetzt. Die Dateinamen von geänderten Objekten werden in eine Liste gespeichert, welche von einem seperaten Thread abgearbeitet wird. Zitat:
Deine Idee, bei einem Fehler zunächst eine andere Datei auszulesen, bzw. den Thread zu pausieren, ist ein guter (und auch logischer) Ansatz, den ich heute Abend ausprobieren werde. Mal sehen ob's klappt. Falls nicht, meld ich mich nochmal 8) Danke erstmal |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz