Fügen Sie mit einem StreamWriter Zeilen an eine Datei an

170

Ich möchte Zeilen an meine Datei anhängen. Ich benutze einen StreamWriter:

StreamWriter file2 = new StreamWriter(@"c:\file.txt");
file2.WriteLine(someString);
file2.Close();

Die Ausgabe meiner Datei sollte mehrere Zeichenfolgen untereinander sein, aber ich habe nur eine Zeile, die jedes Mal überschrieben wird, wenn ich diesen Code ausführe.

Gibt es eine Möglichkeit, den StreamWriter an eine vorhandene Datei anhängen zu lassen?

Wegpunkt
quelle
19
Vergessen Sie nicht zu entsorgen StreamWriter. Ein usingBlock ist dafür eine bessere Syntax.
TheCodeKing
1
Dies ist auch der Grund, warum ich mich lieber nicht um Streams kümmern möchte, wenn ich sehr schnelle Aktualisierungen einer Datei mithilfe von File.AppendAllText - msdn.microsoft.com/en-us/library/ms143356.aspx
Chris
@TheCodeKing - Können Sie mir dafür einen Code zeigen?
Steam
4
@ Blastousing (var stream = new StreamWriter(..)) { stream.WriteLine(..); }
TheCodeKing

Antworten:

279

Verwenden Sie stattdessen Folgendes:

new StreamWriter("c:\\file.txt", true);

Mit dieser Überladung des StreamWriter-Konstruktors können Sie auswählen, ob Sie die Datei anhängen oder überschreiben möchten.

C # 4 und höher bietet die folgende Syntax, die einige besser lesbar finden:

new StreamWriter("c:\\file.txt", append: true);
Øyvind Bråthen
quelle
145
 using (FileStream fs = new FileStream(fileName,FileMode.Append, FileAccess.Write))
 using (StreamWriter sw = new StreamWriter(fs))
 {
    sw.WriteLine(something);
 }
Andrey Taptunov
quelle
13

Ich gehe davon aus, dass Sie den gesamten obigen Code jedes Mal ausführen, wenn Sie etwas in die Datei schreiben. Jedes Mal, wenn der Stream für die Datei geöffnet wird, wird der Suchzeiger am Anfang positioniert, sodass alle Schreibvorgänge das überschreiben, was zuvor vorhanden war.

Sie können das Problem auf zwei Arten lösen: entweder mit der praktischen

file2 = new StreamWriter("c:/file.txt", true);

oder indem Sie den Stream-Zeiger explizit selbst neu positionieren:

file2 = new StreamWriter("c:/file.txt");
file2.BaseStream.Seek(0, SeekOrigin.End);
Jon
quelle
Was ist, wenn die Datei 10 MB hat und ich von Position 0 aus mit dem Schreiben beginne, aber nur 10 KB. Wie kann ich sicherstellen, dass die Datei nur die 10 KB-Daten enthält, die ich gerade geschrieben habe?
JobaDiniz
10

Versuche dies:

StreamWriter file2 = new StreamWriter(@"c:\file.txt", true);
file2.WriteLine(someString);
file2.Close();
Marco
quelle
7

Ersetzen Sie dies:

StreamWriter file2 = new StreamWriter("c:/file.txt");

mit diesem:

StreamWriter file2 = new StreamWriter("c:/file.txt", true);

true zeigt an, dass Text angehängt wird.

Waqas
quelle
5

Eine weitere Option ist die Verwendung von System.IO.File.AppendText

Dies entspricht den StreamWriter-Überladungen, die andere angegeben haben.

Auch File.AppendAllText bietet möglicherweise eine etwas einfachere Oberfläche, ohne sich um das Öffnen und Schließen des Streams kümmern zu müssen. Möglicherweise müssen Sie sich dann Sorgen machen, ob Sie Ihre eigenen Zeilenumbrüche einfügen. :) :)

Chris
quelle
5

Eigentlich hat nur Jons Antwort (5. September 11 um 9:37) mit BaseStream.Seek für meinen Fall funktioniert. Danke Jon! Ich musste Zeilen an eine zip-archivierte txt-Datei anhängen .

using (FileStream zipFS = new FileStream(@"c:\Temp\SFImport\test.zip",FileMode.OpenOrCreate))
{
    using (ZipArchive arch = new ZipArchive(zipFS,ZipArchiveMode.Update))
    {
        ZipArchiveEntry entry = arch.GetEntry("testfile.txt");
        if (entry == null)
        {
            entry = arch.CreateEntry("testfile.txt");
        }
        using (StreamWriter sw = new StreamWriter(entry.Open()))
        {
            sw.BaseStream.Seek(0,SeekOrigin.End);
            sw.WriteLine("text content");
        }
    }
}

quelle
3

Eine einfachere Möglichkeit besteht darin, den File.AppendTextUTF-8-codierten Text an eine vorhandene Datei oder an eine neue Datei anzuhängen, wenn die angegebene Datei nicht vorhanden ist und a zurückgibtSystem.IO.StreamWriter

using (System.IO.StreamWriter sw = System.IO.File.AppendText(logFilePath + "log.txt"))
{                                                
    sw.WriteLine("this is a log");
}
Vinod Srivastav
quelle
1

Ersetzen Sie diese Zeile:

StreamWriter sw = new StreamWriter("c:/file.txt");

mit diesem Code:

StreamWriter sw = File.AppendText("c:/file.txt");

und schreiben Sie dann Ihre Zeile wie folgt in die Textdatei:

sw.WriteLine("text content");
Shahaf
quelle