2011-09-05 45 views
128

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

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

La salida de mi archivo debe estar por debajo de varias cadenas entre sí, pero tengo sólo una fila, que se sobrescribe cada vez que ejecute el código.

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

+15

No se olvide de disponer 'StreamWriter'. Un bloque 'using' es mejor sintaxis para esto. – TheCodeKing

+1

También es por esto que prefiero no preocuparme por las transmisiones cuando realizo actualizaciones muy rápidas en un archivo utilizando File.AppendAllText - http://msdn.microsoft.com/en-us/library/ms143356.aspx – Chris

+0

@TheCodeKing - Can ¿Me muestras un código para hacer eso? – Steam

Respuesta

213

Use este lugar:

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

Con esta sobrecarga del constructor StreamWriter que elegir si agrega el archivo o reescribir.

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

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

Reemplazar esta:

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

con esto:

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

true indica que se Agrega texto.

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

Prueba esto:

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

Asumo que está ejecutando todo del código anterior cada vez que escriba algo para 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 la conveniente

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

o mediante el reposicionamiento de forma explícita la corriente puntero a sí mismo:

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

¿Qué sucede si el archivo tiene 10mb y empiezo a escribir desde la posición 0, pero solo 10kb, cómo puedo asegurar que el archivo * solo * contiene los datos de 10kb que acabo de escribir? – JobaDiniz

5

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

Este 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. :)

4

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

Reemplazar esta línea:

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

con este código:

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

y luego escribir su línea en el fichero de texto como este:

sw.WriteLine("text content"); 
2

Uno más La forma simple es usar el File.AppendText anexa codificación UTF-8 de texto a un archivo existente, oa un nuevo archivo si no existe el archivo especificado y devuelve un System.IO.StreamWriter

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