2010-11-24 9 views
6

J'ai un fichier texte de journal simple avec l'extension de .txt avec une ligne d'espace blanc à la fin de ce fichier texte chaque fois que le fichier journal est généré à partir d'un programme tiers.Comment supprimer la dernière ligne d'un fichier texte?

Par conséquent existe-t-il des méthodes ou des codes que je peux utiliser pour supprimer la dernière ligne du fichier texte?

Un exemple du fichier texte du journal:

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

Jetez un oeil ici: http://stackoverflow.com/questions/532217/efficient-way-to-delete-a-line-from-a- texte-fichier, la suppression de la dernière ligne devrait être comme la suppression de tout o ligne. –

Répondre

18

Que diriez-vous quelque chose comme:

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

Explication:

Techniquement, vous ne supprimez pas une ligne d'un fichier. Vous lisez le contenu d'un fichier et les écrivez en excluant le contenu que vous souhaitez supprimer.

Ce que ce code fait est de lire toutes les lignes dans un tableau et d'écrire ces lignes dans le fichier en excluant seulement la dernière ligne. (La méthode Take() (Partie de LINQ) prend le nombre de lignes spécifié qui, dans notre cas, est length - 1). Ici, var lines peut être lu comme String[] lines.

+0

Mec, pouvez-vous s'il vous plaît expliquer les codes là-haut pour moi? Merci – JavaNoob

+0

Explication ajoutée. – decyclone

+0

File.ReadAllLines est bien pour les petits fichiers, mais voudriez-vous vraiment l'utiliser si le fichier contenait un million de lignes? –

10

Utilisez cette méthode pour supprimer la dernière ligne du fichier:

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

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

} 

Edit: Réalisés la variable lignes n'existait pas auparavant, donc je mis à jour le code.

+0

Ajouter un rep pour la réponse correcte aussi! – JavaNoob

1

Si vous souhaitez supprimer des dernières lignes N à partir d'un fichier sans charger tous en mémoire:

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 
} 

Ce qui se passe est que vous en mémoire tampon chaque nouvelle ligne dans une file d'attente avec la dimension numLastLinesToIgnore et pop rock un ligne à écrire uniquement lorsque la file d'attente est pleine. Vous en fait lire en avance le fichier et vous êtes en mesure d'arrêter numLastLinesToIgnore lignes avant la fin du fichier est atteint, sans connaître le nombre total de lignes à l'avance.

Notez que si le texte a moins de numLastLinesToIgnore, le résultat est vide.

je suis venu avec comme une solution de miroir à ceci: Delete specific line from a text file?

1

Vous ne pouvez pas supprimer la fin de la ligne, comme File.WriteAllLines ajoute automatiquement, cependant, vous pouvez utiliser cette méthode:

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

Ce n'est pas à moi, je l'ai trouvé à .NET File.WriteAllLines leaves empty line at the end of file

Questions connexes