Frage zum Filehandling
-
Hallo,
ich weiß nicht ob das in dieses Forum gehört, wüßte aber nicht in welches sonst.
Es geht um Filehandling und zwar:
Von einer Warenwirtschaft (von extern) wird in in regelmäßigen Abständen eine Datei mit Kundenadressen erstellt z.Bsp "Kundendaten.txt".
Diese Datei muß ich mit meiner Anwendung bearbeiten( zerlegen , in die Datenbank schreiben etc.) und dann wegkopieren bzw. löschen.
Dies wollte ich in einem Worker Thread machen, in dem in z.Bsp 200 Milisekunden
das Verzeichnis überwacht wird.Der Haken ist , wie Ihr Euch vorstellen könnt der Zugriff von zwei Schnittstellen , einerseits mein Worker Thread, und andererseits die Warenapplikation
Ich möchte diese Datei erst dann wegkopieren wenn gerade das Warensystem dort keine Daten reinschreibt.Ich habe hier an Erstellen einer Kopie von dem File Gedacht z.bsp mit
"[Dateiname]_temp.txt" und dann überprüfen ob sich die Größe des ursprünglichen Files zu dem temporären File verändert hat, und erst dann wegkopierenHabt Ihr schon so etwas gemacht , oder habt Ihr eine andere Idee ?.
Danke schön im voraus.
-
entweder bin ich vom tag etwas geschaft, oder der text ist für mich etwas schwer verständlich...
abe ich versuche es mal..
meinst duSynchronize()?
-
Hallo
ich denke auch, das du das mit einem Flag innerhalb deiner Anwendung regeln solltest. Was benutzt du für ein Datenbank-System? Vielleicht bietet diese ja Locks, um einzelne Datensätze, Tabellen oder die ganze Datenbank sperrt. Je nachdem, wie aufwendig der Import der Datei ist, läßt du während des Export die Benutzeroberfläche sperren, z.B. mit einem kleinen modalen Hinweisfenster.
bis bald
akari
-
Danke für Eure Mühe, aber ich glaube Ihr habt mich nicht verstanden,
bzw. ich habs nicht sachgemäß formuliert.Hier eine Ergänzung:
Das Warensystem, oder sonst ein Program, das in die Datei schreibt ist extern.
Es ist nicht meine Applikation.Mein Programm dagegen überwacht ein Verzeichnis, sagen wir mal im
100 Milisec Takt, und "schaut" ob dort diese o.g. Datei vorliegt.Wenn Ja, dann soll die durch meine App verarbeitet werden .
Was mit der Datei gemacht werden soll ist eigentlich unwichtig...Danach soll diese Datei aber,
(damit die nicht nochmal in die Verarbeitungsroutine kommt)
verschoben werden (z.Bsp ins Verzeichnis "Backup" ).So weit so gut.
Irgendwann kommt es allerdings zu der Situation, daß zu dem Zeitpunkt wo ich die Datei verschieben möchte , gerade das externe Programm eine neue Datei dort erstellt, so daß ich zu diesem Zeitpunkt:
a.
nicht weiß ob es sich um eine neue Datei handelt,
(es sei denn , ich lege die Dateien immer temporär an und vergleiche deren Größe mit der der neuen Datei)b.Ich diese zu dem Zeitpunkt gar nicht löschen kann
c.
ich die neue datei zunächst verarbeiten müßte und erst danach löschen sollte.Ich hoffe , jetzt ist mein Problem etwas deutlicher geworden.
Danke schon mal für weitere Anregungen!
-
Hm, warum bennenst Du die Datei vor dem Import nicht einfach um?
So lange die Warenwirtschaft die Datei exklusiv sperrt, wenn sie reinschreibt, bist Du auf der sicheren Seite.
-
So würde ich das auch machen, wenn Du feststellst, dass eine Datei da ist dann würde ich die sofort in z.B. "Kundendaten.tmp" umbenennen und diese Datei dann verarbeiten.
Die ändert sich dann ja nich mehr.
-
War auch meine Idee , wie Ihr in den ersten Posts sehek nönnt.
Habe mir gedacht, daß es auch etwas eleganter geht...
-
Noch ein Tipp: Anstatt aktiv (wahrscheinlich mit einem Timer) alle 100ms zu prüfen, ob die Datei da ist, könnte man sich auch über Verzeichnisänderungen von Windows informieren lassen. Du kannst dir ja mal die Funktion FindFirstChangeNotification() ansehen.
-
Der Tipp von Warp hört sich gut an

Ich werde in einem Thread die Funktion FindFirstChangeNotification
dazu mißbrauchen
Danke an Euch Alle!