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 Zugriffsfehler bei Ordnerüberwachung (https://www.delphipraxis.net/118706-zugriffsfehler-bei-ordnerueberwachung.html)

Moyyer 13. Aug 2008 10:25


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

littleDave 13. Aug 2008 12:04

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:
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;
Dieses Record füllst du dann mit den entsprechenden Parametern aus und fügst es wie gesagt in eine Liste hinzu.

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.

Moyyer 13. Aug 2008 13:39

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:

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.
z.Z. versucht der Thread solange eine Datei zu bearbeiten bis es klappt.
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