Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriff auf eine extern geöffnete Datei nicht möglich ? (https://www.delphipraxis.net/85415-zugriff-auf-eine-extern-geoeffnete-datei-nicht-moeglich.html)

little_budda 30. Jan 2007 14:35


Zugriff auf eine extern geöffnete Datei nicht möglich ?
 
Hallo,

ich muss auf die Protokollausgaben eines externen Programmes reagieren.
Das Programm erzeugt zur Laufzeit eine Protokolldatei.

Ich starte dieses Programm und möchte gerne über einen Timer
alle zwei Sekunden das Protokoll einlesen und auswerten.

Dazu nutze ich folgenden Code
Delphi-Quellcode:
var bLoadFile : boolean;
    fMyProtFile : textfile;
    sLineValue : string;

...

  bLoadFile := true;
  LB_Protokoll.Items.clear;
  try
    AssignFile(fMyProtFile, sExportPfad + sLogFileName);  // Datei ausgewählt
    Reset(fMyProtFile);
    while not EOF(fMyProtFile) do
      begin
        Readln(fMyProtFile, sLineValue);                  // Erste Zeile der Datei lesen }
        LB_Protokoll.Items.add(sLineValue);
      end;
    CloseFile(fMyProtFile);
   except
    bLoadFile := false;
  end;
  if (bLoadFile = true) then
    begin

...
Nun öffnet mir der Code die Datei erst wenn sich mein externes Programm geschlossen hat.
Wenn ich zur Laufzeit die Datei mit einem Betrachter ansehe, klappt das problemlos.

Kann ich irgendwie anders auf die Datei zugreifen?

Gruß Holger.

:gruebel:

shmia 30. Jan 2007 14:48

Re: Zugriff auf eine extern geöffnete Datei nicht möglich ?
 
Deine ganze vorgehensweise ist VIEL zu umständlich.
Folgendes ist ausreichend:
Delphi-Quellcode:
LB_Protokoll.Items.LoadFromFile(sExportPfad + sLogFileName);
Es könnte nun sein, dass die Log-Datei noch geschrieben wird, während du die Datei einlesen möchtest.
Dann muss man folgendes tun:
Delphi-Quellcode:
procedure LoadFromFile2(s: TStrings; const FileName: string);
var
  Stream: TStream;
begin
  // durch das auskommentieren des Flags fmShareDenyWrite dürfen
  // anderere Prozesse gleichzeitig schreiben
  Stream := TFileStream.Create(FileName, fmOpenRead {or fmShareDenyWrite});
  try
    s.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;
...
LoadFromFile2(LB_Protokoll.Items, sExportPfad + sLogFileName);

little_budda 30. Jan 2007 15:04

Re: Zugriff auf eine extern geöffnete Datei nicht möglich ?
 
Danke,

ich habe vorher "LoadFromFile" verwendet,
bin aber als es nicht geklappt hat, auf die zeilenweise Lösung gegangen.

Gruß Holger.

hoika 30. Jan 2007 15:09

Re: Zugriff auf eine extern geöffnete Datei nicht möglich ?
 
Hallo,

schau dir mal FileMode an,
standardmässig wird die Datei readwrite geöffnet.


Heiko

shmia 30. Jan 2007 15:23

Re: Zugriff auf eine extern geöffnete Datei nicht möglich ?
 
Zitat:

Zitat von little_budda
ich habe vorher "LoadFromFile" verwendet,
bin aber als es nicht geklappt hat, auf die zeilenweise Lösung gegangen.

Ich hab dir ja jetzt eine saubere, moderne Lösung mit TStream gezeigt.
Die Funktionen AssignFile, rewrite, readln, ... stammen noch aus der Pascal Steinzeit
und sollten überhaupt nicht mehr verwendet werden.
Aber man kann das alte Denken wohl nicht ausrotten. :-(

little_budda 31. Jan 2007 06:50

Re: Zugriff auf eine extern geöffnete Datei nicht möglich ?
 
Hallo,

ich habe die Lösung von Smia umgesetzt.
Sie bringt mir leider keinen Erfolg.
Jetzt kommte die selbe Meldung die ich vorher auch mit "LoadFromFile" hatte.
Meldung "Datei kann nicht geöffnet werden".

Gibt es noch andere Möglichkeiten eine geöffnete Datei auszulesen?

Gruß Holger.

:gruebel:

himitsu 31. Jan 2007 12:21

Re: Zugriff auf eine extern geöffnete Datei nicht möglich ?
 
Ja gibt es (solange die Datei mit ausreichend Sharingrechten geöffnet wurde) ... dein Betrachter kann es ja auch :zwinker:


Du mußt nur selber beachten, daß du selber auf die nötigen Rechte achtest. :warn:

Da die Datei von dem anderem Programm bereits mit Schreibrechten geöffnet
und vermutlich auch das Schreiben für andere Programme verboten wurde,

solltest du nur Lesend (mit Lese- und keinem Schreibzugriff) und am Besten allen Sharingrechten an die Datei rangehen.

Für die WinAPIs wären es diese Rechte:
> Access: GENERIC_READ
> Share: FILE_SHARE_WRITE or FILE_SHARE_READ

Allerdings regeln das viele Delphifunktionen intern etwas anders,
z.B. gehen einige einen Umweg über die globale Variable FileMode (siehe OH).

little_budda 31. Jan 2007 12:42

Re: Zugriff auf eine extern geöffnete Datei nicht möglich ?
 
Hallo,

danke für die Hilfe.
Nur kann ich mit
Zitat:

Für die WinAPIs wären es diese Rechte:
> Access: GENERIC_READ
> Share: FILE_SHARE_WRITE or FILE_SHARE_READ
leider so gar nichts anfangen.

Wie bekomme ich denn über API Funktionen den Text in meine Listbox?

Gruß Holger.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz