ich ein seltsames Problem mit FileStream.SetLength gefunden (0). Wenn erst einmal etwas in einen Stream zu schreiben und dann SetLength Aufruf (0), noch der Inhalt des vorherigen Schreib in die Datei geschrieben wird:Nach StreamWriter.WriteLine(), FileStream.SetLength (0) leer die Datei nicht
var fileName = "test.txt";
using (var fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read, 8000, FileOptions.None))
{
using (var streamWriter = new StreamWriter(fileStream, Encoding.Default, bufferSize: 8000, leaveOpen: true))
{
streamWriter.WriteLine("123");
fileStream.SetLength(0);
streamWriter.WriteLine("abc");
}
}
var fileContent = File.ReadAllText(fileName);
filecontent wird "123 \ r \ nabc \ r \ n"
Offensichtlich wurde 123 nicht gelöscht, auch wenn es vor dem Aufruf von SetLength (0) geschrieben wurde.
seek() oder die Position auf 0 gesetzt hat nicht geholfen.
In meiner Anwendung, ich bin in eine Datei zu schreiben, die ich offen zu halten. Von Zeit zu Zeit kann es vorkommen, dass ich die Datei komplett leeren muss und einen anderen Inhalt schreiben muss. Aus Leistungsgründen möchte ich den streamWriter nicht schließen.
Hinweis für all jene Leute, die lieben zu Unrecht Fragen zu markieren als Duplikate
ich die sehr frustrierende Erfahrung auf Stackoverflow gemacht, dass eine Frage als Duplikat falsch markiert wurde. Ich verbrachte einen Tag damit, die Frage zu schreiben, er entscheidet in einem Augenblick, dass es ein Duplikat ist, auch wenn es nicht so ist. Das passiert normalerweise, wenn der Typ die Frage nicht wirklich versteht und sich nicht die Mühe macht, die richtige Antwort zu finden. Er fühlt einfach, dass ein ähnliches Problem zuvor auf SO gelöst wurde. Aber Details sind wichtig. Ja, es gibt Fragen zum Abschneiden einer Datei mit SetLength (0), aber sie unterscheiden sich in einem entscheidenden Punkt: In diesen Beispielen steht SetLength (0) kein Write() vorangestellt. Aber das ist wichtig, ohne es gibt es kein Problem.
Bitte, bitte, seien Sie sehr vorsichtig und rücksichtsvoll, wenn durch Markieren eine Frage als Duplikat andere von der Beantwortung zu blockieren.
Die Stream wissen nicht, dass man um mit ihrem zugrunde liegenden Strom ist in Unordnung. Es hat einen Puffer selbst, Sie müssen es() flush(). –
Einziger Weg, um wirklich klar zu sein, ist, zu schließen und wieder als neuer Stream zu öffnen. – jdweng
@jdweng: Meine Lösung mit Flush() scheint zu funktionieren, obwohl ich vielleicht nicht erkennen, dass es ein Problem verursacht. Kannst du beschreiben, was das sein könnte? –