AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Zugriffsfehler bei Ordnerüberwachung
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsfehler bei Ordnerüberwachung

Ein Thema von Moyyer · begonnen am 13. Aug 2008 · letzter Beitrag vom 13. Aug 2008
Antwort Antwort
Moyyer

Registriert seit: 31. Mai 2003
155 Beiträge
 
Delphi 7 Enterprise
 
#1

Zugriffsfehler bei Ordnerüberwachung

  Alt 13. Aug 2008, 10:25
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.

- 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.

Mfg Moyyer
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#2

Re: Zugriffsfehler bei Ordnerüberwachung

  Alt 13. Aug 2008, 12:04
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.
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
Moyyer

Registriert seit: 31. Mai 2003
155 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Zugriffsfehler bei Ordnerüberwachung

  Alt 13. Aug 2008, 13:39
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01: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