Entwickler-Ecke
Dateizugriff - Datei mehrfach öffnen
cherokee - Di 03.06.08 15:56
Titel: Datei mehrfach öffnen
Hi Leute,
ich hab folgendes Setting: Ein Prozess, der versch. Ereignisse in einer Datei loggt.
Jetzt würde ich gern eine Administrationsoberfläche dazu basteln, in der man u.A. den aktuellen Inhalt der log-Datei abrufen kann. An dieser Stelle bekomme ich ne Fehlermeldung, dass die Datei bereits geöffnet ist.
Wie kann ich bewerkstelligen, dass das funktioniert, während mein Prozess läuft, kann ich die log-Datei ja auch im Editor öffnen.
Grüße,
Michi
FinnO - Mo 09.06.08 19:29
Du schließt die Datei einfach nach jedem loggen wieder :D
Freiberger - Mo 09.06.08 19:59
Versuche doch mal, die Datei als STREAM zu öffen, manchmal klappt es...
delphi10 - Di 10.06.08 10:15
Guckst du
Shared-Modus in Fileopen-Funktion -> F1
Gruß Delphi10
Edit:
Dieses Codebeispiel öffnet die Datei im Output-Modus. Alle Prozesse können Lese- und Schreiboperationen auf der Datei ausführen.
Delphi-Quelltext
1: 2: 3:
| FileOpen(1, "TESTFILE", OpenMode.Output, OpenShare.Shared) ' Close before reopening in another mode. FileClose(1) |
cherokee - Di 10.06.08 16:23
Hi!
Habe das Problem mittlerweile so wie von Finn0 beschrieben umgangen. (Hat halt den Nachteil, dass ich das ganze in einem Objekt 'innerhalb' einer TCriticalSection machen muss, da es in unterschiedlichen Threads abläuft).
Hab die Frage allerdings offen gelassen, um evtl. eine allgemeine Antwort zu erhalten.
@delphi10: Ich finde FileOpen nur in der Unit SysUtils. Dort ist sie aber so definiert: function FileOpen(const FileName: string; Mode: LongWord): Integer;. Sie wäre also mit deinen Parametern nicht aufrufbar. Suche nach 'OpenMode' bzw. 'OpenShare' lieferte keine Ergebnisse. Wo hast du denn die Funktion her?
Grüße,
Michi
Yogu - Di 10.06.08 17:29
Hallo,
wie wär's denn mit einem
TFileStream? Da kannst du die Berechtigungen angeben.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure Log(const FileName: String); var Stream: TFileStream; begin Stream := TFileStream.Create(FileName, fmCreate or fmShareDenyWrite); try finally Stream.Free; end; end; |
Durch das
fmShareDenyWrite erreichst du, dass nur das Schreiben verboten wird. Lesen kann man die Datei dann noch. Und wenn du die Logdatei nicht neu erstellen willst, sondern die Daten unten anhängen willst, ersetzt du einfach
fmCreate in
fmOpenReadWrite, und führst vor dem Schreiben noch folgende Zeile aus:
Delphi-Quelltext
1:
| Stream.Seek(soFromEnd, 0); |
Dadurch setzt du den Cursor an das Ende der Datei.
Edit: Jetzt sehe ich, dass es ja im Editor klappt. Sorry, dann halt nochmal das Auslesen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure Log(const FileName: String); var Stream: TFileStream; begin Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone); try finally Stream.Free; end; end; |
Grüße,
Yogu
delphi10 - Di 10.06.08 21:10
cherokee hat folgendes geschrieben: |
Hi!
Wo hast du denn die Funktion her? |
F1 in Borland® Delphi® für Microsoft® Windows™ Version 10.0.2288.42451 Update 2 Copyright © 2005 Borland® Software Corporation.
Gruß Delphi10
cherokee - Mi 11.06.08 11:12
Ahh, danke.
Habs jetzt auch gefunden. Ich hatte bei meiner Suche .NET ausgeschlossen, da ich nicht damit programmiere. Außerdem zeigt es mir die Funktion für alle möglichen Programmiersprachen, nur nicht für Delphi an. Seltsam.
Naja, ich werd bei Gelegenheit (momentan funktioniert ja der Workaround) mal die Variante mit den Streams testen.
@all: Danke!
Martok - Mi 11.06.08 11:58
In Win32-Delphi:
Delphi-Quelltext
1:
| hFile = FileOpen('TESTFILE.LOG', fmCreate or fmShareDenyWrite) |
oder wenn du AssignFile usw. nutzt:
vor dem Rewrite
FileMode := fmCreate or fmShareDenyWrite setzen.
cherokee - Do 12.06.08 09:30
Super! Danke!
Hab ich irgendwie überlesen ...
Grüße,
Michi
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!