2009-08-27 8 views
0

Je veux supprimer une ligne dans un fichier txt après avoir obtenu les données avec StreamReader.WriteLine(). mais je ne peux pas obtenir de référence utile pour le web. quelqu'un me dit que je peux le faire avec la méthode Repalce(). Mais je ne pense pas que c'est efficace. quelqu'un peut-il me dire comment le résoudre. Merci!C#: supprimer une ligne dans un fichier Txt

+0

Quelle est la raison de la considérer comme une méthode inefficace? –

Répondre

4

Vous ne pouvez pas supprimer quelque chose au milieu d'un fichier. Vous devez soit réécrire tout à partir de ce point, ou simplement réécrire le fichier entier. Et si vous utilisez StreamReader/StreamWriter, vous n'avez aucun accès à la position du fichier, donc votre seul choix est de réécrire le fichier entier.

Voici un exemple de méthode pour le faire.

public static void RemoveLines(Predicate<string> removeFunction,string file){ 
     string line, tempFile = null; 
     try{ 
      tempFile = Path.GetTempFileName(); 
      using (StreamReader sr = new StreamReader(file)) 
      using (StreamWriter sw = new StreamWriter(tempFile,false,sr.CurrentEncoding)) 
       while ((line = sr.ReadLine()) != null) 
        if (!removeFunction(line)) sw.WriteLine(line); 
      File.Delete(file); 
      File.Move(tempFile, file); 
     }finally{ 
      if(tempFile != null && File.Exists(tempFile)) 
       File.Delete(tempFile); 
     } 
    } 

Utilisé comme celui-ci

RemoveLines(line=>line.Length==10,"test.txt") 

il supprime toutes les lignes d'une longueur de 10 caractères, et utilise un fichier temporaire pour minimiser les risques. Bien sûr, si vous voulez quelque chose de plus court, vous pouvez faire quelque chose comme ça.

File.WriteAllLines(fileName,File.ReadAllLines(fileName).Where(line => line.Length != 10)) 

nécessite de la mémoire plus de travail, et vous devriez probablement faire l'affaire tempfile/déplacer pour se prémunir contre une panne d'ordinateur provoque un fichier corrompu. Mais c'est un code compact et facile à comprendre.

Questions connexes