Añada líneas a un archivo usando StreamWriter

Quiero agregar líneas a mi archivo. Estoy usando un StreamWriter:

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

La salida de mi archivo debe tener varias cadenas debajo de la otra, pero solo tengo una fila, que se sobrescribe cada vez que ejecuto este código.

¿Hay alguna forma de dejar que StreamWriter se anexe a un archivo existente?

Use esto en su lugar:

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

Con esta sobrecarga del constructor StreamWriter, usted elige si agrega el archivo o lo sobrescribe.

C # 4 y superior ofrece la siguiente syntax, que algunos encuentran más legible:

 new StreamWriter("c:\\file.txt", append: true); 
  using (FileStream fs = new FileStream(fileName,FileMode.Append, FileAccess.Write)) using (StreamWriter sw = new StreamWriter(fs)) { sw.WriteLine(something); } 

Supongo que está ejecutando todo el código anterior cada vez que escribe algo en el archivo. Cada vez que se abre la secuencia del archivo, su puntero de búsqueda se coloca al principio, por lo que todas las escrituras terminan sobrescribiendo lo que estaba allí antes.

Puede resolver el problema de dos maneras: ya sea con el conveniente

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

o reposicionando explícitamente el puntero de la secuencia usted mismo:

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

Prueba esto:

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

Reemplace esto:

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

con este:

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

true indica que agrega texto.

Utilice este constructor StreamWriter con el 2do parámetro – true .

Otra opción es usar System.IO.File.AppendText

Esto es equivalente a las sobrecargas de StreamWriter que otros dieron.

También File.AppendAllText puede proporcionar una interfaz ligeramente más fácil sin tener que preocuparse por abrir y cerrar la transmisión. Aunque es posible que deba preocuparse por poner sus propios linebreaks. 🙂

En realidad, solo la respuesta de Jon (5 de septiembre de 2011 a las 9:37) con BaseStream.Seek funcionó para mi caso. Gracias Jon! Necesitaba agregar líneas a un archivo comprimido zip txt.

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

Una forma más sencilla es usar el File.AppendText anexa texto codificado en UTF-8 a un archivo existente, o a un archivo nuevo si el archivo especificado no existe y devuelve un System.IO.StreamWriter

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

Reemplace esta línea:

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

con este código:

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

y luego escribe tu línea en el archivo de texto de esta manera:

 sw.WriteLine("text content");