Autor |
Beitrag |
cherokee
Hält's aus hier
Beiträge: 12
|
Verfasst: Di 03.06.08 15:56
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
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Mo 09.06.08 19:29
Du schließt die Datei einfach nach jedem loggen wieder 
|
|
Freiberger
      
Beiträge: 130
WIN XP
Delphi 7
|
Verfasst: Mo 09.06.08 19:59
Versuche doch mal, die Datei als STREAM zu öffen, manchmal klappt es...
|
|
delphi10
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: 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) |
_________________ Salus populi suprema lex esto
|
|
cherokee 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: 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
_________________ Salus populi suprema lex esto
|
|
cherokee 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
cherokee 
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 12.06.08 09:30
Super! Danke!
Hab ich irgendwie überlesen ...
Grüße,
Michi
|
|