2010-11-24 21 views
6

Ich habe eine einfache Log-Text-Datei mit der Erweiterung. TXT mit einer weißen Leerstelle am Ende der Textdatei jedes Mal, wenn die Protokolldatei von einem Drittanbieter-Programm generiert wird.Wie lösche ich die letzte Zeile in einer Textdatei?

Gibt es also Methoden oder Codes, mit denen ich die letzte Zeile der Textdatei löschen kann?

Ein Beispiel für die Protokolltextdatei:

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

Werfen sie einen Blick hier: http://stackoverflow.com/questions/532217/efficient-way-to-delete-a-line-from-a- Text-Datei, Löschen der letzten Zeile sollte genauso sein wie Löschen von o andere Linie. –

Antwort

18

Wie wäre es so etwas wie:

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

Erläuterung:

Technisch Sie keine Zeile aus einer Datei löschen. Sie lesen den Inhalt einer Datei und schreiben sie mit Ausnahme des Inhalts, den Sie löschen möchten, zurück.

Dieser Code liest alle Zeilen in ein Array und schreibt diese Zeilen zurück in die Datei mit Ausnahme nur der letzten Zeile. (Take() - Methode (Teil von LINQ) nimmt die Anzahl der Zeilen, die in unserem Fall ist Länge - 1). Hier kann var lines als String[] lines gelesen werden.

+0

Alter, kannst du mir bitte die Codes erklären? Danke – JavaNoob

+0

Erklärung hinzugefügt. – decyclone

+0

File.ReadAllLines ist für kleine Dateien in Ordnung, aber möchten Sie es wirklich verwenden, wenn die Datei eine Million Zeilen enthält? –

10

Mit dieser Methode können Sie die letzte Zeile der Datei entfernen:

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

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

} 

Edit: Realisiert zuvor die Linien Variable nicht existiert, so dass ich den Code aktualisiert.

+0

Fügen Sie rep für die richtige Antwort hinzu! – JavaNoob

1

Wenn Sie aus einer Datei letzten N Zeilen löschen, ohne alle in den Speicher geladen:

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 
} 

Was passiert, ist, dass Sie eine neue Zeile in einer Queue-Puffer mit Dimension numLastLinesToIgnore und es öffnet sich ein Zeile, die nur geschrieben wird, wenn die Warteschlange voll ist. Sie tatsächlich Read-ahead die Datei und Sie können numLastLinesToIgnore Zeilen stoppen, bevor das Ende der Datei erreicht wird, ohne zu wissen, die Gesamtzahl der Zeilen im Voraus.

Beachten Sie, dass das Ergebnis leer ist, wenn Text weniger als numLastLinesToIgnore hat.

kam ich mit ihm als Spiegel Lösung auf den Punkt: Delete specific line from a text file?

1

Sie können die Zeilenende nicht löschen, da File.WriteAllLines es automatisch fügt jedoch hinzu, Sie diese Methode verwenden können:

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

Dies ist nicht mein, ich fand es bei .NET File.WriteAllLines leaves empty line at the end of file

Verwandte Themen