2011-09-05 24 views
128

Desidero aggiungere righe al mio file. Sto usando uno StreamWriter:Aggiungi righe a un file utilizzando StreamWriter

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

L'uscita del mio file dovrebbe essere più stringhe sotto l'altro, ma ho solo una riga, che viene sovrascritto ogni volta che faccio funzionare questo codice.

C'è un modo per consentire a StreamWriter di accodarsi a un file esistente?

+15

Non dimenticate di smaltire 'StreamWriter'. Un blocco 'using' è una sintassi migliore per questo. – TheCodeKing

+1

Questo è anche il motivo per cui preferisco non preoccuparmi degli stream quando si eseguono aggiornamenti rapidi di un file utilizzando File.AppendAllText - http://msdn.microsoft.com/en-us/library/ms143356.aspx – Chris

+0

@TheCodeKing - Can mi fai vedere un codice per farlo? – Steam

risposta

213

Utilizzare questo invece:

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

Con questo overload del costruttore StreamWriter si sceglie se si aggiunge il file, o sovrascrivere esso.

C# 4 e soprattutto offre la seguente sintassi, che alcuni trovano più leggibile:

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

Sostituire questo:

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

con questo:

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

true indica che aggiunge il testo.

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

Prova questo:

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

Presumo si sta eseguendo tutte del codice di cui sopra ogni volta che si scrive qualcosa al file. Ogni volta che viene aperto il flusso per il file, il puntatore di ricerca viene posizionato all'inizio così tutte le scritture finiscono per sovrascrivere quello che c'era prima.

È possibile risolvere il problema in due modi: o con il comodo

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

o riposizionando in modo esplicito il flusso di puntatore da soli:

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

E se il file ha 10mb e inizio a scrivere dalla posizione 0, ma solo 10kb, come posso assicurare che il file * only * contenga solo i dati 10kb che ho appena scritto? – JobaDiniz

5

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

Questo è equivalente agli overload di StreamWriter che altri hanno fornito.

Anche File.AppendAllText può fornire un'interfaccia leggermente più semplice senza doversi preoccupare dell'apertura e chiusura del flusso. Anche se potrebbe essere necessario quindi preoccuparsi di inserire i propri interruzioni di riga. :)

4

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

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

Sostituire questa linea:

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

con questo codice:

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

e quindi scrivere la riga al file di testo come questo:

sw.WriteLine("text content"); 
2

One more modo semplice sta usando il File.AppendText si aggiunge codifica UTF-8 di testo a un file esistente, o in un nuovo file se il file specificato non esiste e restituisce un System.IO.StreamWriter

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