Seite 1 von 1

Datei erst lesen wenn sie geschlossen wurde

Verfasst: 27.08.2007 18:07
von Onkel-Till
Hallo,


der Teufel steckt im Detail:

Eine Warenwirtschafts Software erstellt hier bei uns reine txt Dateien
die ich (bereits erfolgreich ins PDF Format konvertiere - ja ja fragt nicht
warum ;-)) egal

Das Problem ist das mein Tool die Dateien mit "ExamineDirectory"
und "ReadFile" bearbeitet und es teilweise dazukommt das die TXT Datei
noch nicht fertig geschrieben wurde. Es kommt also zu Fehlern :( Gibt es eine möglichkeit oder Befehl herauszufinden ob eine Datei noch geöffnet ist und wenn ja durch welche Applikation?


gruß
till

Verfasst: 27.08.2007 18:14
von a14xerus
ich bin mir nicht sicher, aber vielleciht kannst du anstatt "readfile()" "openfile()" nehmen, weil openfile die datei auch zum schrieben öffnet, und das geht ja nur, wenn die datei nicht benutzt wird...
also sollte openfile solange fehlschlagen, bis die datei nichtmehr benutzt wird.

Verfasst: 27.08.2007 18:24
von Onkel-Till
wie lustig genau das habe ich auch probiert :(

leider mit genau dem selben effekt ;)

ich befürchte das diese TXT Dateien von der Warenwirtschafts Software
mehrere male geöffnet und geschlossen werden. Man kann ziemlich deutlich in der Software sehen das Daten aus einer Datenbank geladen und immer seperat eine Meldung kommt "Wird gespeichert"

Was natürlich doof für mich ist.....ich könnte natürlich nun messen ob sich die Datei in den letzten Minuten in der Größe geändert hat ;)))))))))


arrgl

Verfasst: 27.08.2007 18:48
von PureLust
Onkel-Till hat geschrieben:.....ich könnte natürlich nun messen ob sich die Datei in den letzten Minuten in der Größe geändert hat ;)
So in der Art wäre das jetzt auch mein Tip gewesen, jedoch hätte ich einfach das Datum gechecked und wenn die Datei älter als z.B. 5 Minuten ist (= 5 Minuten keine weitere Änderung), dann könntest Du vermutlich davon ausgehen, dass Eure Warenwirtschaft mit dem Export fertig ist.

Greetz, PL.

Verfasst: 27.08.2007 18:58
von Onkel-Till
Jepp! Danke für Eure Hilfe,


ich habe (leider) recht behalten: Die Dateien werden wirklich so geschrieben

Jedoch hätte ich eine Frage: OpenFile würde theoretisch die Datei nicht
öffnen wenn eine andere Applikation diese verwendet? Oder?

Sprich OpenFile würde mein Freund sein?!

Verfasst: 27.08.2007 19:07
von PureLust
Onkel-Till hat geschrieben:Sprich OpenFile würde mein Freund sein?!
... oder Dein Feind.
Denn wenn Deine Warenwirtschaft die Datei zwischenzeitlich immer wieder schließt und Du sie wärend dessen mit Deinem Programm per OpenFile öffnest und blockierst, wer weiss, wie Deine Warenwirtschaft reagiert wenn sie erneut versucht da hinein zu schreiben und diese dann von Deinem Programm blockiert ist. :roll:

Verfasst: 27.08.2007 19:15
von Onkel-Till
ja in dem Fall mein Feind ;)


Aber ich werde das wohl oder übel so machen das mein Tool dann einmal
in der Nacht läuft, wenn hier niemand im Büro ist :(

Nochmals Danke für Eure Hilfe - wie immer super Forum :) !!!!!!

Verfasst: 27.08.2007 19:42
von Kiffi
eine andere Möglichkeit wäre es, zu versuchen, ob man die Datei (nach
Ablauf der Wartezeit) umbenennen kann.

Code: Alles auswählen

If RenameFile(MeineDatei, MeineDatei) = 0
 ; Blockiert
EndIf
Grüße ... Kiffi

Verfasst: 27.08.2007 22:32
von Ligatur
Hallo,
Wenn das Programm unter Windows läuft versuche doch mal Mutex zu verwenden. Z.B. so:

Code: Alles auswählen

a = CreateMutex_(0, #True, "TestMutex")
If GetLastError_() = #ERROR_ALREADY_EXISTS
	MessageRequester("Mutex", "Existiert schon")
	End
EndIf

OpenWindow(0, 0, 0, 640, 480, "Mutex", #PB_Window_SystemMenu)

Repeat

Until WaitWindowEvent() = #PB_Event_CloseWindow

Am einfachsten währe es, wie oben vor dem zum Schreiben öffnen ein Mutex zu erstellen, wenn das nicht klappt, kann momentan nicht gespeichert werden. Der Name des Mutex könnte z.B. dein Programmname und der Dateiname sein damit der Mutexname systemweit einmalig ist und zu deiner Datai ebenso. Eine Datei mit anderen Dateinamen könntest du so trotzdem noch erstellen. Wenn die Datei wieder geschlossen wird muß der Mutex dann wieder mit CloseHandle(MutexHandle) wieder freigegebn werden. (MutextHandle ist das, was bei CreateMutex zurückgegeben wird, im Beispiel also das a).
Eleganter (aber komplizierter) geht es mit den zu den Mutexen gehörigen Waitfunktionen, dann kann das Programm darauf warten, bis ein Mutex freigegeben wird bis es auf die Datei zugreift. Mehr dazu im MSDN.

Trotzdem mal als kleines Beispiel obigen Code mit Wiat - Funktion:

Code: Alles auswählen

a = CreateMutex_(0, #True, "TestMutex")
If GetLastError_() = #ERROR_ALREADY_EXISTS
	MessageRequester("Mutex", "Existiert schon")
	WaitForSingleObject_(a, #INFINITE)
EndIf

hwnd = OpenWindow(0, 0, 0, 640, 480, "Mutex", #PB_Window_SystemMenu)
CreateGadgetList(hwnd)
ButtonGadget(0, 5, 5, 80, 25, "Close")
Repeat
	e = WaitWindowEvent()
	If e = #PB_Event_Gadget And EventGadget() = 0
		ReleaseMutex_(a)
	EndIf
Until e = #PB_Event_CloseWindow
Wenn dieses Programm jetzt mehrfach gestartet wird öffnet sich nur vom ersten das Fenster. Das zweite wartet, bis man beim ersten auf das Close - Gadget klickt. Dann wird das Mutex freigegeben (ReleaseMutex_(MutexHandle)) und das als nächstes gestartete öffnet das Fenster. Allerdings muß man aufpassen, befindet sich WaitForSingleObject() in einer Nachrichtenschleife eines Fensters darf #INFINITE nicht verwendet werden, dann muß stattdessen ein Timeout eingegeben werden um dann die Fensternachrichten bearbeiten zu können oder das Speichern muß in einem Thread geschehen.

Gruß,
Ligatur

Re: Datei erst lesen wenn sie geschlossen wurde

Verfasst: 28.08.2007 10:16
von Kaeru Gaman
@Ligatur

grundsätzlich keit schlechter Vorschlag, aber auf den Schreibzugriff hat Till keinen Einfluß:
Onkel-Till hat geschrieben:Eine Warenwirtschafts Software erstellt hier bei uns reine txt Dateien
ich glaube, dann wäre das problem auch wesentlich geringer.

;----------------------------------------------

@Till

startet die warenwirtschafts-sodtware zum schreiben der datei einen subprozess?
wenn ja, dann könntest du einen überwacher programmieren, der prüft,
ob der schreibprozess läuft und solange eine globale ampel auf rot stellt.

wenn dein leser auf dem selben rechner läuft wie der schreiber,
kann dein leser das auch selber überwachen.