Laden...

[gelöst] Wieso schreibt StreamWriter zusätzliche Zeilen am Ende des Files?

Erstellt von OXO vor 3 Jahren Letzter Beitrag vor 3 Jahren 926 Views
O
OXO Themenstarter:in
86 Beiträge seit 2020
vor 3 Jahren
[gelöst] Wieso schreibt StreamWriter zusätzliche Zeilen am Ende des Files?

Hallo zusammen,

ein Kollege hat ein Tool zum Ersetzen von Zeichen aus Quellcode-Dateien geschrieben. Der ersetzte Text soll dann in eine Datei mit demselben Encoding geschrieben werden. Das Encoding wurde aus dem Input-File ermittelt und stimmt nach dem Schreiben des neuen Files mit dem Original überein.

Das Problem ist, dass der zu schreibende String zwar im Debugger richtig aussieht, aber dass nach dem Close() des StreamWriter die letzten 4 Zeilen aus dem String noch zusätzlich hinten angehängt werden. Also im Sinne eines Quellcode-Files, sind dann am Ende noch zusätzlich z.B. 4 Zeilen mit "}" zusätzlich zu sehen.

Wie ist sowas denn sowas zu erklären??

Ein zusätzlich expliziter Aufruf von Flush() und Close() hat bei dem Konstrukt, wie zu erwarten, auch nichts gebracht.


FileStream fs = null;
try
{
	fs = new FileStream(outputFile, FileMode.Open, FileAccess.Write);
	using (StreamWriter sw = new StreamWriter(fs, encoding))
	{
		sw.Write(content);
		// sw.Flush();
		// sw.Close();
	}
}
finally
{
	if (fs != null)
		fs.Dispose();
}

D
161 Beiträge seit 2017
vor 3 Jahren

Der Codeausschnitt ist soweit korrekt.

Aber mehr kann ich auch nicht sagen, weil ich den Rest des Codes nicht kenne.
Und so aus dem Kopf, kenne ich den Fehler nicht.

4.938 Beiträge seit 2008
vor 3 Jahren

Kann es sein, daß du dieselbe Datei wieder überschreibst (aber nicht vorher [den Inhalt] löschst)?
Du solltest wohl eher FileMode.Create oder FileMode.Open | FileMode.Truncate benutzen, s. FileMode.

Aber warum nutzt du nicht einfach


File.WriteAllText(outputFile, content, encoding)

?

PS: Und wenn schon, dann auch beim FileStream using benutzen...

O
OXO Themenstarter:in
86 Beiträge seit 2020
vor 3 Jahren

Das sind gute Hinweise!

Werde ich mal so weitergeben. Wenn ich das so lesen, denke ich, dass es dann über File.WriteAllText(...) wohl am besten ist.

Vielen Dank schon einmal!