2009-04-26 13 views
6

Sto tentando di aprire un file di testo per la lettura in un'applicazione Delphi 7, ma sto ricevendo errore I/O 32 (violazione di condivisione) perché un'altra applicazione ha già il file aperto. Ho provato a impostare FileMode su "fmOpenRead o fmShareDenyNone", ma ora mi rendo conto che non si applica comunque ai file di testo.Delphi - Condivisione violazione file di testo di apertura

C'è un modo di leggere file di testo aperti da un'altra applicazione?

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

Perché sei così appassionato di file di testo? Perché non utilizzare le classi di flusso che consentono l'accesso corretto ai file e le modalità di condivisione? – mghie

+0

perché voglio leggere una singola riga alla volta e TFileStream non ha metodi per questo. Suppongo di poter leggere un buffer pieno e dividere su CR/LF. – Simes

+1

È possibile utilizzare 'TStreamReader' per leggere le righe da un' TFileStream'. Ha un metodo 'ReadLine()' e fa il buffering internamente per te. –

risposta

1

Questo risolverà il problema all'istante. Carica il file utilizzando una TStringList. Basta chiamare:

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

ho scoperto che si tratta di file di testo, è meglio usare il TStringList. Altrimenti andrei su TFileStream e lì puoi specificare la tua modalità di apertura.

+0

non utile? Simes, hai provato questo? –

+0

LoadFromFile() utilizza (almeno in Delphi 5 e 2007) "fmOpenRead o fmShareDenyWrite" per la modalità. Questo non è sicuramente ciò che l'OP sta volendo. – mghie

+0

??? Questo è esattamente ciò che vuole Simes, però. Vuole solo LEGGERE il file senza preoccuparsi di altri processi che lo utilizzano. Questa era esattamente la sua domanda. –

3

Dipende da come questo altro processo ha aperto il file ... Se il file è stato aperto in modo esclusivo, non avrà alcun esito.

E TextFile è vecchio cappello, penso che si aprirà in modalità esclusiva per essere compatibile con DOS vecchio stile. Dovresti usare TFileStream o simili.

TStringList può funzionare anche in base a ciò che l'altro processo sta facendo. Ma se il file viene scritto (come un file .log), fmShareDenyWrite non funzionerà.

+0

Non so come l'altro processo sta aprendo il file, ma Blocco note può aprirlo correttamente mentre viene scritto. – Simes

+0

Allora sembra che tu sia fortunato. Basta eliminare TextFile. –

+0

@Simes, delineo un processo che mostra esattamente il modo in cui i file vengono aperti, qui: http://stackoverflow.com/questions/737053/log-file-monitor/739328#739328 –

1

Se non ricordo male, c'è anche una variabile Textfilemode che si applica solo ai file di testo.

+0

Sarebbe perfetto, ma non viene compilato e non può trovarlo nell'aiuto. – Simes

1

Forse in questo modo:

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

utilizzare il metodo di TStringList LoadFromStream, piuttosto che LoadFromFile. Si arriva a controllare il blocco in questo modo:

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; 

Questo esempio sta usando il flusso di caricare in un TStringList. Se vuoi solo leggere pezzi, puoi farlo. Basta leggere dal flusso.

+0

Funziona e risolve il problema. L'unico problema riguarda l'utilizzo della memoria: l'intero file viene caricato in memoria. Questo potrebbe essere un problema. – Ghigo