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?

Punto de referencia
fuente
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);
Øyvind Bråthen
fuente
145
 using (FileStream fs = new FileStream(fileName,FileMode.Append, FileAccess.Write))
 using (StreamWriter sw = new StreamWriter(fs))
 {
    sw.WriteLine(something);
 }
Andrey Taptunov
fuente
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);
Jon
fuente
¿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();
Marco
fuente
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.

Waqas
fuente
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. :)

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

fuente
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");
}
Vinod Srivastav
fuente
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");
Shahaf
fuente