2012-12-04 13 views
6

Ich habe den folgenden Code-Block, der mir Kopfschmerzen bereitet.FileStream Sperren einer Datei zum Lesen und Schreiben C#

Logisch sollte es funktionieren, wie ich den Filestream benutze, der die Sperre in der using-Anweisung bereitstellt. Wenn es zu der Zeile kommt, die den StreamWriter erstellt, schlägt es fehl und sagt "die Datei ist nicht schreibbar".

Jetzt ist mein Programm eine Multithread-Anwendung. Jeder Thread könnte versuchen, in diese Datei zu schreiben. Ich brauche das Programm, um die Datei zu sperren, den Inhalt zu lesen, den Inhalt zu überprüfen und dann alle Änderungen zurückzuschreiben. Während dieses Vorgangs sollte kein anderer Thread auf diese Datei zugreifen können.

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(); 
} 

Antwort

6

Die FileShare.NONE Flagge verursacht keine Fäden in die Warteschlange, es sperrt nur die Datei, damit die Ausnahme, die Sie erhalten. Um sich gegenseitig ausschließenden Zugriff zu gewähren, können Sie ein gemeinsames Objekt vor dem Schreiben sperren.

Aber Sie sagen das "Jetzt ist mein Programm eine Multithread-Anwendung. Jeder Thread könnte versuchen, in diese Datei zu schreiben." Verwenden diese Threads alle genau die gleiche Methode, um in die Datei zu schreiben? Nehmen wir an, sie tun, dann sollte diese Arbeit ...

Erstellen Sie eine statische Klassenvariablen ...

private static object lockObject = new object(); 

es hier verwenden ...

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

ich gemacht habe einige Annahmen über die Threads, so müssen Sie möglicherweise Informationen zur Synchronisation nachschlagen, wenn dies nicht funktioniert oder uns weitere Informationen zur Verfügung stellen.

Schließen Sie Ihren StreamReader auch früher (falls die Methode früher zurückkehrt). Schließen Sie es sofort, nachdem Sie es verwendet haben.

Verwandte Themen