2013-02-02 6 views
19

Ich lief in etwas Interessantes, wenn ein StreamWriter mit einem FileStream mit Text in eine vorhandene Datei in .NET 4.5 (haben keine älteren Frameworks versucht) anzuhängen. Ich habe es auf zwei Arten versucht, eine hat funktioniert und die andere nicht. Ich frage mich, was der Unterschied zwischen den beiden ist.Schreiben in txt-Datei mit Stream und Filestream

Beiden Methoden enthielten den folgenden Code an der Spitze

if (!File.Exists(filepath)) 
    using (File.Create(filepath)); 

Ich habe die Schöpfung in einer using Aussage, weil ich durch persönliche Erfahrung gefunden habe, dass es die beste Art und Weise, dass die Anwendung vollständig die Datei schließt, um sicherzustellen, ist .

Nichtarbeitsweise:

using (FileStream f = new FileStream(filepath, FileMode.Append,FileAccess.Write)) 
    (new StreamWriter(f)).WriteLine("somestring"); 

Mit dieser Methode nichts endet an die Datei angehängt werden.

Arbeitsweise:

using (FileStream f = new FileStream(filepath, FileMode.Append,FileAccess.Write)) 
    using (StreamWriter s = new StreamWriter(f)) 
     s.WriteLine("somestring"); 

ich ein bisschen googeln getan haben, ohne recht zu wissen, was zu suchen, und haben nichts informativ. Also, warum ist es so, dass der anonyme StreamWriter fehlschlägt, wo die (nicht-anonyme? Benannt?) StreamWriter funktioniert?

+2

Ich nehme an, der 'StreamWriter' schreibt nichts, bis 'flushed' und seine 'Dispose'-Methode, die implizit aufgerufen wird, indem sie mit dem' using'-Block verwendet wird, automatisch löscht. BEARBEITEN: Beachten Sie, dass der 'StreamWriter' eine Eigenschaft besitzt, die dieses Verhalten kontrollieren kann, wenn es automatisch gestartet wird. Flush den Stream, wenn Sie schreiben, was ich vermute, ist 'false' standardmäßig. –

+2

Dies wurde bereits beantwortet, aber warum sollten Sie Code so formatieren? Es ist ungeheuerlich, IMO zu lesen und zu verstehen, sowie ein erhöhtes Risiko bei der Einführung von Fehlern durch einfache Formatierungsfehler. Ich bin ein großer Fan von Zahnspangen - immer! – TheCodeKing

+0

@TheCodeKing Wenn es bereits beantwortet wurde, würde es Ihnen etwas ausmachen, einen Link zur Verfügung zu stellen? Ich habe ehrlich danach gesucht und jede vorgeschlagene Antwort vor dem Posten betrachtet und habe nichts gesehen, was sie beantwortet hat (hauptsächlich wegen meiner Verwendung einer anonymen Funktion.) Außerdem bin ich nicht hier, um Dinge zu diskutieren, die am meisten sind stilistisch und nach Vorliebe. IMO-Code, der mit Klammern bedeckt ist, die tatsächlich nicht benötigt werden, ist schwerer zu lesen. –

Antwort

19

Es klingt wie Sie nicht den Strom spülen hat.

http://msdn.microsoft.com/en-us/library/system.io.stream.flush.aspx

Es ist wie Stream sieht schreibt in einen Puffer vor, in diesem Fall an das endgültige Ziel zu schreiben, die Datei. Möglicherweise können Sie auch die AutoFlush-Eigenschaft festlegen und sie nicht explizit löschen.

http://msdn.microsoft.com/en-us/library/system.io.streamwriter.autoflush.aspx

Ihre Frage zu beantworten, wenn Sie die „Verwendung“ Block verwenden, fordert er die Streamwriter verfügen, das muss wiederum Anruf Flush.

+0

Es ist ein bisschen schwierig, die AutoFlush-Eigenschaft auf einen anonymen 'StreamWriter' zu setzen, finden Sie nicht? Es sei denn, ich verpasse etwas. –

+2

Sie sollten niemals anonyme Instanzen von Typen erstellen, die IDisposable implementieren. – xxbbcc

+2

Ich würde nicht empfehlen, AutoFlush zu verwenden und das Objekt nicht zu entsorgen. Wenn ein Objekt entsorgbar ist, sollte es entsorgt werden. – dtb

7

Der Unterschied zwischen den beiden Code-Snippets ist die Verwendung von using. The using statement disponiert das Objekt am Ende des Blocks.

Ein StreamWriter puffert Daten, bevor sie in den zugrunde liegenden Stream geschrieben werden. Durch das Disponieren des StreamWriter wird der Puffer geleert. Wenn Sie den Puffer nicht löschen, wird nichts geschrieben.

Von MSDN:

Sie müssen Close aufrufen, um sicherzustellen, dass alle Daten korrekt an den zugrunde liegenden Stream geschrieben wird.

Siehe auch: When should I use “using” blocks in C#?

+0

Kein Schmerz, weil ich das mehr oder weniger schon angenommen habe, aber wäre es möglich für Sie, einige Hinweise darauf hinzuzufügen, wo ich diese Informationen online finden könnte? Dies ist so gut für andere, als es mein eigenes ist. –

Verwandte Themen