2011-08-10 265 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

相關問題