2010-06-27 5 views
5

J'utilise un TFileSteam pour ouvrir un fichier journal. J'aimerais pouvoir lire ce fichier journal à partir d'autres processus. Je pensais que le mode fmShareDenyWrite le permettrait. Toutefois, si j'essaie d'ouvrir le fichier à partir d'autres processus, j'obtiens une erreur. Par exemple, si j'essaie de taper le fichier à partir de la ligne de commande, j'obtiens «le processus ne peut pas accéder au fichier parce qu'il est utilisé par un autre processus».Le mode fmShareDenyWrite ne semble pas fonctionner

Voici le code d'initialisation du fichier:

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

REMARQUE: J'utilise la version Delphi 6.

+1

Dans quel mode les autres applications l'ouvrent-elles? – mj2008

Répondre

8

Je ne sais pas si cela était déjà un bogue dans D6, mais qui est une possibilité distincte. Il y a un rapport de QC sur ceci signalé contre D2007: QC 65767: http://qc.embarcadero.com/wc/qcmain.aspx?d=65767. Ce rapport est maintenant fermé, car il a été résolu dans D2010 (14.0.3467.22472 pour être exact).

Mise à jour (vous y êtes invité par le commentaire de Gabr):

Vous pouvez créer votre propre descendant TFileStream qui honore le mode. Remplacez juste le constructeur Create(const AFileName: string; Mode: Word; Rights: Cardinal) (il y a deux constructeurs surchargés) et manipulez vous-même le paramètre mode. Copiez le code du constructeur d'origine et changer le

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

à

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

où est une var Mon Mode locale de type Word.

+0

Cette entrée de QC fournit également la solution. – gabr

2

le mode mfCreate ne se comporte pas/fonctionner correctement avec tous les attributs d'actions. Pour contourner, vous devez créer un fichier gérer vous-même et de le transmettre au constructeur

Cheer

+0

Pourriez-vous me donner un échantillon de code? – Aheho

Questions connexes