2010-06-27 10 views
5

Ich benutze ein TFileSteam, um eine Protokolldatei zu öffnen. Ich möchte diese Protokolldatei von anderen Prozessen lesen können. Ich dachte, der fmShareDenyWrite-Modus würde dies ermöglichen.fmShareDenyWrite-Modus scheint nicht zu funktionieren

Wenn ich jedoch versuche, die Datei von anderen Prozessen zu öffnen, erhalte ich einen Fehler. Wenn ich beispielsweise versuche, die Datei über die Befehlszeile einzugeben, bekomme ich "der Prozess kann nicht auf die Datei zugreifen, weil sie von einem anderen Prozess verwendet wird".

ist die Dateiinitialisierung Code:

if FileExists(AutoLogFileName) then 
    _ActivityLogStream := TFileStream.Create(AutoLogFileName, 
      fmOpenReadWrite or fmShareDenyWrite) 
else 
    _ActivityLogStream := TFileStream.Create(AutoLogFileName, 
      fmCreate or fmShareDenyWrite); 

HINWEIS: I Delphi-Version mit jedem Aktie-Attribute 6.

+1

Welchen Modus verwenden die anderen Apps, um sie zu öffnen? – mj2008

Antwort

8

Sie wissen nicht, ob dies bereits ein Fehler in D6, aber das ist eine klare Möglichkeit. Es gibt einen QC-Bericht darüber, der gegen D2007 berichtet wurde: QC 65767: http://qc.embarcadero.com/wc/qcmain.aspx?d=65767. Dieser Bericht ist nun geschlossen, da er in D2010 (14.0.3467.22472, um genau zu sein) gelöst wurde.

Update (von Gabr Kommentar dazu aufgefordert werden):

Sie können Ihren eigenen TFileStream Nachkommen erstellen, die den Modus nicht einlöst. Überschreiben Sie einfach den Create(const AFileName: string; Mode: Word; Rights: Cardinal) Konstruktor (es gibt zwei überladene Konstruktoren) und behandeln Sie den Modusparameter selbst. Kopieren Sie den Code aus dem ursprünglichen Konstruktor und ändern die

if Mode = fmCreate then 
    begin 
    inherited Create(FileCreate(AFileName, Rights)); 

zu

if (Mode and fmCreate = fmCreate) then 
    begin 
    myMode := Mode and $FF; 
    if myMode = $FF then 
     myMode := fmShareExclusive; 
    inherited Create(FileCreate(AFileName, myMode, Rights)); 

wo myMode eine lokale var vom Typ Wort.

+0

Dieser QC-Eintrag bietet auch die Lösung. – gabr

2

mfCreate Modus nicht verhalten/Arbeit richtig verwendet. Zum Umgehen, müssen Sie erstellen Datei selbst verarbeiten und übergeben es an den Konstruktor

Cheer

+0

Können Sie mir ein Codebeispiel geben? – Aheho

Verwandte Themen