2012-12-04 16 views
6

Ho il seguente blocco di codice che mi sta facendo venire il mal di testa.FileStream che blocca un file per leggere e scrivere C#

Logicamente dovrebbe funzionare come sto usando il filestream che fornisce il blocco all'interno dell'istruzione using. Quando arriva alla linea che crea StreamWriter, non riesce a dire "il file non è scrivibile".

Ora il mio programma è un'applicazione multithread. Qualsiasi thread potrebbe provare a scrivere su questo file. Ho bisogno del programma per bloccare il file, leggere il contenuto, controllare il contenuto, quindi scrivere nuovamente eventuali modifiche. Durante questo processo, nessun altro thread dovrebbe essere in grado di accedere a quel file.

using (var fs = File.Open(fileLoc, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) 
{ 
    var sr = new StreamReader(fs); 
    var str = sr.ReadToEnd(); 
    var strArray = str.Split(','); 
    if (strArray.Any(st => st == text)) 
    { 
     return; 
    } 
    sr.Close(); 

    var sw = new StreamWriter(fs); 
    sw.Write(str + text); 
    sw.Flush(); 
    sw.Close(); 
} 

risposta

6

Il FileShare.NONE bandiera non causa thread per coda, solo blocca il file, e quindi l'eccezione che si ottiene. Per fornire l'accesso mutuamente esclusivo è possibile bloccare un oggetto condiviso prima della scrittura.

Ma tu dici questo "Ora il mio programma è un'applicazione multithread: qualsiasi thread potrebbe provare a scrivere su questo file". Ora, questi thread usano tutti esattamente lo stesso metodo per scrivere sul file? Supponiamo lo fanno, allora questo dovrebbe funzionare ...

Creare una variabile di classe statica ...

private static object lockObject = new object(); 

Utilizzare qui ...

lock (lockObject) 
{ 
    var sw = new StreamWriter(fs); 
    sw.Write(str + text); 
    sw.Flush(); 
    sw.Close(); 
} 

Ho fatto alcune ipotesi circa i thread, quindi potrebbe essere necessario cercare informazioni sulla sincronizzazione se questo non funziona o fornire ulteriori informazioni a noi.

Inoltre, chiudere lo StreamReader in precedenza (nel caso in cui il metodo ritorni prima). Chiudilo subito dopo averlo usato.

Problemi correlati