2017-05-11 2 views
0

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.

+0

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(). –

+0

Einziger Weg, um wirklich klar zu sein, ist, zu schließen und wieder als neuer Stream zu öffnen. – jdweng

+0

@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? –

Antwort

1

Wenn FileStream.SetLength() on referencesource.microsoft.com Inspektion ich dieses lustig aussehende Stück Code bemerkt:

 // Handle buffering updates. 
     if (_writePos > 0) { 
      FlushWrite(false); 
     } 

Es prüft innerhalb SetLength(), wenn der interne Filestream-Puffer noch einigen Schreib Inhalt hat und schreibt sie zuerst in die Datei, vor der Ausführung der Rest von SetLength().

Ein sehr seltsames Verhalten. Ich könnte dieses Problem lösen, indem Sie den internen Pufferentleerung vor SetLength() aufrufen, mit einem Flush() zuerst:

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"); 
     streamWriter.Flush(); 
     fileStream.SetLength(0); 
     streamWriter.WriteLine("abc"); 
    } 
    } 
    var fileContent = File.ReadAllText(fileName); 

filecontent ist jetzt: "abc \ r \ n"

Es würde mich interessieren zu hören wenn auch andere fühlen das ist ein Fehler in FileStream?

Verwandte Themen