2012-03-18 21 views
32

Sto monitorando un file di testo che viene scritto da un programma server. Ogni volta che il file viene modificato, il contenuto verrà emesso in una finestra del mio programma.Lettura di un file utilizzato da un altro processo

Il problema è che non riesco a utilizzare il Streamreader sul file poiché è used by another process. La creazione di un Filestream con ReadWrite non andrà bene dato che non riesco a controllare il processo che sta utilizzando il file.

Posso aprire il file nel blocco note. Deve essere possibile accedervi anche se il server lo sta usando.

C'è un buon modo per aggirare questo?

Devo fare quanto segue?

  1. Monitorare il file
  2. Fare una copia temporanea di esso quando cambia
  3. leggere la copia temporanea
  4. Eliminare la copia temporanea.

Ho bisogno di ottenere il testo nel file ogni volta che il server lo modifica.

risposta

67

Se il blocco note è in grado di leggere il file, lo si può fare, chiaramente il programma non ha inserito un blocco di lettura sul file. Il problema che stai incontrando è che StreamReader aprirà il file con FileShare.Read. Che nega l'accesso in scrittura Non può funzionare, l'altro programma ha già ottenuto l'accesso in scrittura.

Avrai bisogno di creare lo StreamReader come questo:

using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
using (var sr = new StreamReader(fs, Encoding.Default)) { 
    // read the stream 
    //... 
} 

Indovinando alla codifica qui. Devi stare attento con questo tipo di codice, l'altro programma sta scrivendo attivamente sul file. Non otterrai un'indicazione affidabile per la fine del file, è possibile ottenere un'ultima riga parziale. In particolare fastidioso quando continui a leggere il file per cercare di ottenere qualsiasi cosa il programma sia stato aggiunto.

+2

Grazie ... Non mi ero reso conto che FileShare.Read non sarebbe corretto in questo caso. –

+2

usando 'FileShare.ReadWrite | FileShare.Delete' puoi accedere a un numero ancora maggiore di file. Vale la pena provare quando 'FileShare.ReadWrite' non è sufficiente – Adassko

+0

@Adassko O quando' FileShare.Read' non è abbastanza, come in questo caso, e nella mia particolare situazione, dove stavo usando quello nello stesso tipo di codice, e dovevo passare a 'FileShare.ReadWrite' per farlo funzionare. – vapcguy

10

chiamata

File.Open(path, FileMode.Read, FileAccess.Read, FileShare.ReadWrite) 

Questo dovrebbe funzionare fino a quando l'altra applicazione non ha bloccato esclusivamente il file.

+0

Grazie. Funzionerà in combinazione con un streamreader? In questo modo: File.Open (percorso, FileMode.Read, FileAccess.Read, FileShare.ReadWrite); Lettore StreamReader = nuovo StreamReader (percorso); – Christoffer

+0

@Tophe: certo. IIRC, il sensore 'StreamReader' può anche prendere questi parametri direttamente. – SLaks

+0

Come sarebbe quello? Se metto FileMode.Open, FileAccess.Read, FileShare.ReadWrite come parametri per Streamreader, non funzionerà. Dice che richiede solo alcuni parametri di codifica. – Christoffer

Problemi correlati