2010-11-24 53 views
6

Tengo un archivo de texto de registro simple con la extensión de .txt con una línea de espacio en blanco al final de ese archivo de texto cada vez que el archivo de registro se genera desde un programa de terceros.¿Cómo borrar la última línea en un archivo de texto?

Por lo tanto, ¿hay algún método o código que pueda utilizar para eliminar la última línea del archivo de texto?

Un ejemplo del archivo de texto de registro:

Sun Jul 22 2001 02:37:46,73882,...b,r/rrwxrwxrwx,0,0,516-128-3,C:/WINDOWS/Help/digiras.chm 
Sun Jul 22 2001 02:44:18,10483,...b,r/rrwxrwxrwx,0,0,480-128-3,C:/WINDOWS/Help/cyycoins.chm 
Sun Jul 22 2001 02:45:32,10743,...b,r/rrwxrwxrwx,0,0,482-128-3,C:/WINDOWS/Help/cyzcoins.chm 
Sun Jul 22 2001 04:26:14,174020,...b,r/rrwxrwxrwx,0,0,798-128-3,C:/WINDOWS/system32/spool/drivers/color/kodak_dc.icm 
+2

un vistazo aquí: http://stackoverflow.com/questions/532217/efficient-way-to-delete-a-line-from-a- texto-archivo, borrar la última línea debería ser como borrar cualquier la línea. –

Respuesta

18

¿Qué tal algo como:

var lines = System.IO.File.ReadAllLines("..."); 
System.IO.File.WriteAllLines("...", lines.Take(lines.Length - 1).ToArray()); 

Explicación:

Técnicamente, no elimine una línea de un archivo. Usted lee los contenidos de un archivo y los escribe de nuevo excluyendo el contenido que desea eliminar.

Lo que hace este código es leer todas las líneas en una matriz y escribir estas líneas en el archivo excluyendo solo la última línea. (El método Take() (Parte de LINQ) toma el número de líneas especificadas que en nuestro caso, es length - 1). Aquí, var lines se puede leer como String[] lines.

+0

Amigo, ¿me puede explicar los códigos que hay para mí? Gracias – JavaNoob

+0

Explicación agregada. – decyclone

+0

File.ReadAllLines está bien para archivos pequeños, pero ¿realmente quieres usarlo si el archivo contiene un millón de líneas? –

10

Utilice este método para eliminar la última línea del archivo:

public static void DeleteLastLine(string filepath) 
{ 
    List<string> lines = File.ReadAllLines(filepath).ToList(); 

    File.WriteAllLines(filepath, lines.GetRange(0, lines.Count - 1).ToArray()); 

} 

Editar: Realizada la variable de líneas no existía previamente, por lo que actualizan el código.

+0

¡Añadir representante para la respuesta correcta también! – JavaNoob

1

Si desea borrar últimas N líneas de un archivo sin cargar todo en la memoria:

int numLastLinesToIgnore = 10; 
string line = null; 
Queue<string> deferredLines = new Queue<string>(); 
using (TextReader inputReader = new StreamReader(inputStream)) 
using (TextWriter outputReader = new StreamWriter(outputStream)) 
{ 
    while ((line = inputReader.ReadLine()) != null) 
    { 
     if (deferredLines.Count() == numLastLinesToIgnore) 
     { 
      outputReader.WriteLine(deferredLines.Dequeue()); 
     } 

     deferredLines.Enqueue(line); 
    } 
    // At this point, lines still in Queue get lost and won't be written 
} 

Lo que pasa es que de tampones nueva línea en una cola con una dimensión numLastLinesToIgnore y pop de ella una línea para escribir solo cuando Queue está lleno. De hecho, leyó por adelantado el archivo y usted puede detener las líneas numLastLinesToIgnore antes de que se llegue al final del archivo, sin conocer el número total de líneas por adelantado.

Tenga en cuenta que si el texto tiene menos de numLastLinesToIgnore, el resultado está vacío.

me ocurrió como una solución a este espejo: Delete specific line from a text file?

1

No se puede eliminar el extremo de la línea, como File.WriteAllLines agrega automáticamente, sin embargo, puede utilizar este método:

public static void WriteAllLinesBetter(string path, params string[] lines) 
{ 
    if (path == null) 
     throw new ArgumentNullException("path"); 
    if (lines == null) 
     throw new ArgumentNullException("lines"); 

    using (var stream = File.OpenWrite(path)) 
    using (StreamWriter writer = new StreamWriter(stream)) 
    { 
     if (lines.Length > 0) 
     { 
      for (int i = 0; i < lines.Length - 1; i++) 
      { 
       writer.WriteLine(lines[i]); 
      } 
      writer.Write(lines[lines.Length - 1]); 
     } 
    } 
} 

Esto no es mío, lo encontré en .NET File.WriteAllLines leaves empty line at the end of file

Cuestiones relacionadas