Agregar líneas a un archivo usando un StreamWriter


170

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 estar varias cadenas una debajo de la otra, pero solo tengo una fila, que se sobrescribe cada vez que ejecuto este código.

¿Hay alguna forma de permitir que StreamWriter se agregue a un archivo existente?


19
No te olvides de deshacerte StreamWriter. Un usingbloque es una mejor sintaxis para esto.
TheCodeKing

1
Esta es también la razón por la que prefiero no preocuparme por las transmisiones cuando hago actualizaciones muy rápidas a un archivo usando File.AppendAllText - msdn.microsoft.com/en-us/library/ms143356.aspx
Chris

@TheCodeKing - ¿Puedes mostrarme algún código para hacer eso?
Steam

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

Respuestas:


279

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 sintaxis, que algunos consideran más legible:

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

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 para que todas las escrituras terminen sobrescribiendo lo que estaba allí antes.

Puede resolver el problema de dos maneras: con el conveniente

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

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

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

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

10

Prueba esto:

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

7

Reemplace esto:

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

con este:

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

true indica que agrega texto.



5

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

Esto es equivalente a las sobrecargas de StreamWriter que otros han dado.

También File.AppendAllText puede proporcionar una interfaz un poco 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 saltos de línea. :)


5

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

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

Una forma más simple es usar el File.AppendTexttexto codificado UTF-8 que se agrega a un archivo existente, o a un nuevo archivo si el archivo especificado no existe y devuelve unSystem.IO.StreamWriter

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

1

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");
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.