2009-04-26 24 views
6

Estoy tratando de abrir un archivo de texto para leer en una aplicación Delphi 7, pero estoy recibiendo error I/O 32 (violación de uso compartido) porque otra aplicación ya tiene el archivo abierto. Intenté configurar FileMode en "fmOpenRead o fmShareDenyNone", pero ahora me doy cuenta de que esto no se aplica a los archivos de texto de todos modos.Delphi: infracción de uso al abrir archivo de texto

¿Hay alguna forma de leer archivos de texto abiertos por otra aplicación?

var 
    f: TextFile; 
begin 
    FileMode := fmOpenRead or fmShareDenyNone; // FileMode IS NOT APPLICABLE TO TEXT FILES!! 
    AssignFile(f, FileName); 
    Reset(f); 
+0

¿Por qué le gustan tanto los archivos de texto? ¿Por qué no utilizar las clases de flujo que permiten el acceso adecuado a archivos y modos de uso compartido? – mghie

+0

porque quiero leer una sola línea a la vez, y TFileStream no tiene métodos para eso. Supongo que podría leer un búfer lleno y dividir en CR/LF. – Simes

+1

Puede usar 'TStreamReader' para leer líneas de un' TFileStream'. Tiene un método 'ReadLine()', y hace el almacenamiento en búfer internamente para usted. –

Respuesta

1

Esto resolverá su problema al instante. Cargue el archivo usando una TStringList. Simplemente llame al:

... 
var sl: TStringList; 
begin 
    sl := TStringList.create(); 
    try 
    sl.loadFromFile(Filename); 
    ...do your stuff here... 
    finally 
    freeAndNil(sl); 
    end; 
end; 

Descubrí que al tratar con archivos de texto, lo mejor es usar la TStringList. De lo contrario, iría por TFileStream y allí puedes especificar tu modo de apertura.

+0

no es útil? Simes, ¿has probado esto? –

+0

LoadFromFile() utiliza (al menos en Delphi 5 y 2007 lo hace) "fmOpenRead o fmShareDenyWrite" para el modo. Esto definitivamente no es lo que el OP quiere. – mghie

+0

??? Sin embargo, esto es exactamente lo que quiere Simes. Solo quiere LEER el archivo sin preocuparse por otros procesos que lo usan. Esa fue exactamente su pregunta. –

3

Depende de cómo ese otro proceso abrió el archivo ... Si abrió el archivo exclusivamente, no va a tener éxito en absoluto.

Y TextFile es viejo, creo que se abrirá en modo exclusivo para ser compatible con Old style DOS. Deberías usar TFileStream o similar.

TStringList también puede funcionar, de nuevo dependiendo de lo que esté haciendo el otro proceso. Pero si el archivo se está escribiendo (como un archivo .log), fmShareDenyWrite no funcionará.

+0

No sé cómo el otro proceso es abrir el archivo, pero el Bloc de notas puede abrirlo correctamente mientras se está escribiendo. – Simes

+0

De lo que parece que estás de suerte. Solo abandona TextFile. –

+0

@Simes, delineo un proceso que muestra exactamente cómo se están abriendo los archivos, aquí: http://stackoverflow.com/questions/737053/log-file-monitor/739328#739328 –

1

Si no recuerdo mal, también hay una variable de archivo de texto que se aplica solo a los archivos de texto.

+0

Eso sería perfecto, pero no se compila y no puede encontrarlo en la ayuda. – Simes

1

Tal como esto:

vFileList := TStringList.Create; 
    try 
    vFileStream := TFileStream.Create('myfile.txt', fmOpenRead or fmShareDenyNone); 
    try 
     vFileList.LoadFromStream(vFileStream); 
    finally 
     vFileStream.Free; 
    end; 
    // Use vFileList 
    finally 
    vFileList.Free; 
    end; 
12

utilizan el método de TStringList LoadFromStream, en lugar de LoadFromFile. Tienes la oportunidad de controlar el bloqueo de esa manera:

var 
    slFile: TStrings; 
    stream: TStream; 
begin 
    slFile := TStringList.Create; 
    try 
     stream := TFileStream.Create(filename, fmOpenRead or fmShareDenyNone); 
     try 
     slFile.LoadFromStream(stream); 
     finally 
     stream.Free; 
     end; 

     //Use the stringlist 
    finally 
     slFile.Free; 
    end; 
end; 

Ese ejemplo es utilizar la corriente para cargar en un TStringList. Si solo quieres leer piezas, puedes hacer eso. Acabo de leer de la corriente.

+0

Esto funciona y resuelve el problema. La única preocupación es acerca del uso de la memoria: todo el archivo se carga en la memoria. Esto podría ser un problema. – Ghigo

Cuestiones relacionadas