gleichzeitige Lesen und schreiben einer Datei in C#
Ich habe eine Datei mit Daten, die ich überwachen möchten änderungen, als auch änderungen von meiner eigenen. Denke wie "Tail -f foo.txt".
Basierend auf dieser threades sieht aus wie genau muss ich das erstellen einer filestream -, und übergeben Sie es beide, Schriftsteller und Leser. Allerdings, wenn der Leser das Ende erreicht, der original-Datei, es nicht zu sehen, die updates, die ich selber Schreibe.
Ich weiß, es scheint wie eine seltsame situation... es ist mehr ein experiment, um zu sehen, ob es getan werden kann.
Hier ist das Beispiel Fall 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();
Nachdem Vergangenheit immer "f", der Leser, wird null zurückgegeben.
InformationsquelleAutor der Frage tbischel | 2010-09-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, zwei Bearbeitungen später...
Sollte diese Arbeit. Das erste mal habe ich es versucht, ich glaube, ich hatte vergessen zu setzen, FileMode.Anhängen auf dem oStream.
InformationsquelleAutor der Antwort MarkPflug
@mikerobi ist korrekt, wenn Sie schreiben, um den stream der Datei-pointer wird verändert und verschoben, bis das Ende des Streams. Was Sie nicht zählen, ist, dass StreamReader hat seinen eigenen Puffer. Es liest 1024 bytes aus der Datei und erhalten Sie Ergebnisse aus diesem Puffer. Bis der Puffer läuft aus, so hat es zu Lesen, aus dem FileStream wieder. Finden nichts, weil der Dateizeiger am Ende der Datei.
Sie wirklich brauchen, zu trennen, FileStreams, jede mit Ihren eigenen file-Zeiger um die Hoffnung dieser Arbeit.
InformationsquelleAutor der Antwort Hans Passant
Glaube ich, dass jedes mal, wenn Sie schreiben, ein Zeichen, Sie sind auf dem Vormarsch die stream-position, so dass die nächste Lesen zu Lesen versucht, nach dem Zeichen, das Sie gerade schrieb. Dies geschieht, weil Ihr stream reader und stream writer sind mit dem gleichen FileStream. Verwenden Sie eine andere filestream-oder versuchen, -1 Zeichen zurück in den stream nach jedem schreiben.
InformationsquelleAutor der Antwort mikerobi
Ist es sehr unwahrscheinlich, dass Sie würde gerne mit einer Lösung für dieses problem, das mit dem gleichen Datenstrom Lesen und schreiben. Das ist besonders der Fall, wenn Sie versuchen zu Lesen, den Schwanz, die Datei mit einem
StreamReader
.Du willst zwei verschiedene Datei-streams. Das schreiben stream kann ein
StreamWriter
wenn Sie mögen. Die Lesung stream sollte einen binären Datenstrom (D. H. erstellen Sie mitFile.OpenRead
oderFileStream.Create
), raw Lesen bytes aus der Datei und konvertieren Sie in text. Meine Antwort auf diese Frage zeigt die Grundlagen, wie es geht.InformationsquelleAutor der Antwort Jim Mischel
Wenn Sie einen Anruf hinzufügen, um
StreamReader.DiscardBufferedData()
ist, dass das Verhalten ändern?InformationsquelleAutor der Antwort Mike Morearty