2011-08-10 244 views
8

我目前可以删除使用一个文本文件的最后一行:删除一个文本文件在C#中的第一行

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

虽然,怎么可能,而不是删除文本文件的开头?

+0

也许不是你正在寻找的答案,但如何将表示第一行的字节替换为NULL?下一次,你可以File.ReadAllLines,它会跳过所有的初始NULL字节 – Polity

回答

8

而不是lines.Take您可以改用,lines.Skip,如:

var lines = File.ReadAllLines("test.txt"); 
File.WriteAllLines("test.txt", lines.Skip(1).ToArray()); 

在年初尽管使用的技术(阅读所有文字,写一切恢复)截断是非常低效的。

关于高效方式:低效率来自将整个文件读入内存的必要性。另一种方式很容易就是在流中查找并将流复制到另一个输出文件,删除原始文件并重命名旧文件。那一个会同样快,但消耗更少的内存。

最后截断文件要容易得多。你可以找到trunaction的位置,并致电FileStream.SetLength()

+1

效率低是的 - 但有什么办法来截断文件的开始? –

+0

是的,你只是省略写我的答案中所述。 –

+2

@ssg:如果您省略了写作部分,那么文件如何更新?我假设我错过了一些东西...... – Chris

4
var lines = System.IO.File.ReadAllLines("test.txt"); 
System.IO.File.WriteAllLines("test.txt", lines.Skip(1).ToArray()); 

Skip消除了来自开始序列元件的给定数。 Take消除了该序列的除末端以外的所有元素。

4

这里是一个另类:

 using (var stream = File.OpenRead("C:\\yourfile")) 
     { 
      var items = new LinkedList<string>(); 
      using (var reader = new StreamReader(stream)) 
      { 
       reader.ReadLine(); // skip one line 
       string line; 
       while ((line = reader.ReadLine()) != null) 
       { 
        //it's far better to do the actual processing here 
        items.AddLast(line); 
       } 
      } 
     } 

更新

如果你需要一个IEnumerable<string>,不想浪费内存,你可以做这样的事情:

public static IEnumerable<string> GetFileLines(string filename) 
    { 
     using (var stream = File.OpenRead(filename)) 
     { 
      using (var reader = new StreamReader(stream)) 
      { 
       reader.ReadLine(); // skip one line 
       string line; 
       while ((line = reader.ReadLine()) != null) 
       { 
        yield return line; 
       } 
      } 
     } 
    } 


    static void Main(string[] args) 
    { 
     foreach (var line in GetFileLines("C:\\yourfile.txt")) 
     { 
      // do something with the line here. 
     } 
    } 
+1

如果没有行,会发生什么情况? – Deleted

+1

什么也没有,因为'ReadLine'在两个调用中都返回null。 – jgauffin

+0

聪明。非常有意义。 – Deleted

0

从文本文件中删除第一行

System.IO.StreamReader file = new System.IO.StreamReader(filePath); 
string data = file.ReadToEnd(); 
file.Close(); 
data = Regex.Replace(data, "<.*\n", ""); 
System.IO.StreamWriter file = new System.IO.StreamWriter(filePath, false); 
file.Write(data); 
file.Close(); 
+1

正则表达式在这种情况下确实是过度杀伤性的 – mike

相关问题