Aggiungi linee a un file usando StreamWriter


170

Voglio aggiungere delle righe al mio file. Sto usando uno StreamWriter:

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

L'output del mio file dovrebbe essere più stringhe l'una sotto l'altra, ma ho solo una riga, che viene sovrascritta ogni volta che eseguo questo codice.

Esiste un modo per consentire a StreamWriter di accodarsi a un file esistente?


19
Non dimenticare di smaltire StreamWriter. Un usingblocco è una sintassi migliore per questo.
TheCodeKing

1
Questo è anche il motivo per cui preferisco non preoccuparsi di flussi di quando si fa molto veloce aggiornamento di un file utilizzando File.AppendAllText - msdn.microsoft.com/en-us/library/ms143356.aspx
Chris

@TheCodeKing - Puoi mostrarmi un po 'di codice per farlo?
Steam,

4
@blastousing (var stream = new StreamWriter(..)) { stream.WriteLine(..); }
TheCodeKing,

Risposte:


279

Usa questo invece:

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

Con questo sovraccarico del costruttore StreamWriter scegli se aggiungere il file o sovrascriverlo.

C # 4 e versioni successive offrono la seguente sintassi, che alcuni trovano più leggibili:

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

145
 using (FileStream fs = new FileStream(fileName,FileMode.Append, FileAccess.Write))
 using (StreamWriter sw = new StreamWriter(fs))
 {
    sw.WriteLine(something);
 }

13

Presumo che tu stia eseguendo tutto il codice sopra ogni volta che scrivi qualcosa nel file. Ogni volta che viene aperto lo stream per il file, il puntatore di ricerca viene posizionato all'inizio in modo che tutte le scritture finiscano per sovrascrivere ciò che c'era prima.

Puoi risolvere il problema in due modi: con il comodo

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

o riposizionando esplicitamente il puntatore del flusso da soli:

file2 = new StreamWriter("c:/file.txt");
file2.BaseStream.Seek(0, SeekOrigin.End);

cosa succede se il file ha 10 MB e inizio a scrivere dalla posizione 0, ma solo 10 KB, come posso assicurare che il file contenga solo i dati 10 KB che ho appena scritto?
JobaDiniz,

10

Prova questo:

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

7

Sostituisci questo:

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

con questo:

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

true indica che accoda il testo.



5

Un'altra opzione sta usando System.IO.File.AppendText

Ciò equivale ai sovraccarichi di StreamWriter che altri hanno dato.

Anche File.AppendAllText può fornire un'interfaccia leggermente più semplice senza doversi preoccupare di aprire e chiudere il flusso. Anche se potresti doverti preoccupare di mettere le tue interruzioni di linea. :)


5

In realtà solo la risposta di Jon (5 settembre 11 alle 9:37) con BaseStream. Cerca ha funzionato per il mio caso. Grazie Jon! Avevo bisogno di aggiungere linee a un file txt archiviato zip.

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");
        }
    }
}

3

Un altro modo semplice è quello di File.AppendTextaggiungere il testo codificato UTF-8 a un file esistente o a un nuovo file se il file specificato non esiste e restituisce unSystem.IO.StreamWriter

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

1

Sostituisci questa riga:

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

con questo codice:

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

e quindi scrivi la tua riga nel file di testo in questo modo:

sw.WriteLine("text content");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.