在C#中删除文本文件的第一行

Joh*_*ton 11 .net c# windows

我目前可以使用以下方法删除文本文件的最后一行:

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

虽然,如何删除文本文件的开头呢?

Sed*_*glu 12

而不是lines.Take你可以使用,lines.Skip而不是:

var lines = File.ReadAllLines("test.txt");
File.WriteAllLines("test.txt", lines.Skip(1).ToArray());
Run Code Online (Sandbox Code Playgroud)

尽管所使用的技术(读取所有文本并将所有内容写回来)的事实非常低效,但在开头时会截断.

关于有效的方法:低效率来自于将整个文件读入内存的必要性.反过来可以很容易地在流中搜索并将流复制到另一个输出文件,删除原始文件,并重命名旧文件.那个会同样快,但消耗更少的内存.

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

  • 是的,效率很低 - 但是有什么方法可以截断文件的开头吗? (2认同)
  • @ssg:如果省略写作部分,那么文件如何更新?我想我错过了一些东西...... (2认同)

And*_*bel 5

var lines = System.IO.File.ReadAllLines("test.txt");
System.IO.File.WriteAllLines("test.txt", lines.Skip(1).ToArray());
Run Code Online (Sandbox Code Playgroud)

Skip从序列的开头消除给定数量的元素.Take从序列的末尾消除除了给定数量的元素之外的所有元素.


jga*_*fin 5

这是一个替代方案:

        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);
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

更新

如果您需要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.
        }
    }
Run Code Online (Sandbox Code Playgroud)