2010-06-27 16 views
5

Estoy usando un TFileSteam para abrir un archivo de registro. Me gustaría poder leer este archivo de registro desde otros procesos. Pensé que el modo fmShareDenyWrite lo permitiría.El modo fmShareDenyWrite no parece funcionar

Sin embargo, si intento abrir el archivo desde otros procesos, aparece un error. Por ejemplo, si intento escribir el archivo desde la línea de comandos, aparece "el proceso no puede acceder al archivo porque lo está usando otro proceso".

Aquí es el código de archivo de inicialización:

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

NOTA: estoy usando la versión Delphi 6.

+1

¿Con qué modo lo están usando otras aplicaciones? – mj2008

Respuesta

8

no saben si esto ya era un error en D6, pero esto es una posibilidad distinta. Hay un informe de control de calidad en este informe contra D2007: QC 65767: http://qc.embarcadero.com/wc/qcmain.aspx?d=65767. Este informe ahora está cerrado, ya que se resolvió en D2010 (14.0.3467.22472 para ser exactos).

Update (incitado por el comentario de Gabr):

Usted puede crear su propio descendiente TFileStream que hace honor a la modalidad. Simplemente anule el constructor Create(const AFileName: string; Mode: Word; Rights: Cardinal) (hay dos constructores sobrecargados) y maneje el parámetro de modo usted mismo. Copiar el código desde el constructor original y cambiar el

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

a

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

donde MyMode es una var de tipo Palabra.

+0

Esa entrada de CC también proporciona la solución. – gabr

2

modo mfCreate no se comporta/trabajar correctamente con cualquier atributo de acción. Para evitar, debe crear el archivo de manejarse y pasarlo al constructor

Cheer

+0

¿Podría darme una muestra de código? – Aheho

Cuestiones relacionadas