Frage

Ich habe eine Datei Daten enthält, dass ich möchte Änderungen überwachen, sowie Add Änderungen meiner eigenen. Denken Sie wie "tail -f foo.txt".

Basierend auf dieses Thema , sieht es aus wie ich sollte nur ein Filestream erstellen und es sowohl an einen Schreiber und Leser weitergeben. Wenn jedoch der Leser das Ende der ursprünglichen Datei erreicht hat, schlägt es Updates sehe ich mich schreiben.

Ich weiß, es scheint wie eine seltsame Situation ... seine mehr ein Experiment, um zu sehen, ob es getan werden kann.

Hier ist der Beispielfall habe ich versucht:


foo.txt:
ein
b
c
d
e
f


        string test = "foo.txt";
        System.IO.FileStream fs = new System.IO.FileStream(test, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite);

        var sw = new System.IO.StreamWriter(fs);
        var sr = new System.IO.StreamReader(fs);

        var res = sr.ReadLine();
        res = sr.ReadLine();
        sw.WriteLine("g");
        sw.Flush();
        res = sr.ReadLine();
        res = sr.ReadLine();
        sw.WriteLine("h");
        sw.Flush();
        sw.WriteLine("i");
        sw.Flush();
        sw.WriteLine("j");
        sw.Flush();
        sw.WriteLine("k");
        sw.Flush();
        res = sr.ReadLine();
        res = sr.ReadLine();
        res = sr.ReadLine();
        res = sr.ReadLine();
        res = sr.ReadLine();
        res = sr.ReadLine();

Nach dem letzten "f" bekommen, der Leser wird NULL zurückgegeben.

War es hilfreich?

Lösung

Ok, zwei Änderungen später ...

Das sollte funktionieren. Das erste Mal habe ich es versucht, ich glaube, ich hatte FileMode.APPEND auf der oStream zu setzen vergessen.

string test = "foo.txt";

var oStream = new FileStream(test, FileMode.Append, FileAccess.Write, FileShare.Read); 
var iStream = new FileStream(test, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

var sw = new System.IO.StreamWriter(oStream);
var sr = new System.IO.StreamReader(iStream); 
var res = sr.ReadLine(); 
res = sr.ReadLine();
sw.WriteLine("g"); 
sw.Flush(); 
res = sr.ReadLine();
res = sr.ReadLine();
sw.WriteLine("h"); sw.Flush();
sw.WriteLine("i"); sw.Flush(); 
sw.WriteLine("j"); sw.Flush(); 
sw.WriteLine("k"); sw.Flush(); 
res = sr.ReadLine(); 
res = sr.ReadLine(); 
res = sr.ReadLine();
res = sr.ReadLine();
res = sr.ReadLine();
res = sr.ReadLine();

Andere Tipps

@mikerobi korrekt ist, wenn Sie in den Stream der Dateizeiger schreiben geändert und an das Ende des Stroms bewegt. Was Sie nicht zählen auf, dass Stream seinen eigenen Puffer hat. Es liest 1024 Bytes aus der Datei und Sie werden Ergebnisse aus diesem Puffer erhalten. Bis der Puffer leer ist, so hat es aus dem Filestream wieder zu lesen. nichts finden, weil der Dateizeiger am Ende der Datei ist.

Sie müssen wirklich zu trennen Filestreams, jede mit ihren eigenen Dateizeiger haben jede Hoffnung, diese Arbeit zu machen.

Ich glaube, dass jedes Mal, wenn ein Zeichen zu schreiben, können Sie die Stromposition vorrücken, so dass die nächsten Leseversuche nach dem Zeichen lesen Sie gerade geschrieben hat. Dies geschieht, weil Stream-Leser und Stromschreiber sind die gleichen Filestream verwenden. Verwenden Sie einen anderen Filestream, oder suchen -1 Zeichen nach jedem Schreib im Strom zurück.

Es ist höchst unwahrscheinlich, dass Sie mit einer Lösung für dieses Problem wäre glücklich, die für das Lesen und Schreiben mit dem gleichen Strom beinhaltet. Das gilt besonders, wenn Sie versuchen, den Schwanz der Datei mit einem StreamReader zu lesen.

Sie möchten zwei unterschiedliche Dateiströme haben. Der Schreibstrom kann ein StreamWriter sein, wenn Sie mögen. Der Lesestrom sollte ein Binärstroms sein (das heißt schaffen mit File.OpenRead oder FileStream.Create), roh Bytes aus der Datei und in Text umwandeln lesen. Meine Antwort auf diese Frage zeigt die Grundlagen, wie es gemacht wird.

Wenn Sie einen Anruf zu StreamReader.DiscardBufferedData() hinzufügen, tut, dass das Verhalten zu ändern?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top