Autor Beitrag
cherokee
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Mo 09.06.08 19:29 
Du schließt die Datei einfach nach jedem loggen wieder :D
Freiberger
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

WIN XP
Delphi 7
BeitragVerfasst: Mo 09.06.08 19:59 
Versuche doch mal, die Datei als STREAM zu öffen, manchmal klappt es...
delphi10
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: 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.
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Di 10.06.08 17:29 
Hallo,

wie wär's denn mit einem TFileStream? Da kannst du die Berechtigungen angeben.

ausblenden 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
    { In den Stream schreiben }
  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:

ausblenden 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:

ausblenden 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
    { Aus dem Stream lesen }
  finally
    Stream.Free;
  end;
end;

Grüße,
Yogu
delphi10
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: Di 10.06.08 21:10 
user profile iconcherokee 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mi 11.06.08 11:58 
In Win32-Delphi:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 12.06.08 09:30 
Super! Danke!

Hab ich irgendwie überlesen ...

Grüße,
Michi