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

C# 删除C中文本文件的第一行#,c#,.net,windows,C#,.net,Windows,我当前可以使用以下方法删除文本文件的最后一行: var lines = System.IO.File.ReadAllLines("test.txt"); System.IO.File.WriteAllLines("test.txt", lines.Take(lines.Length - 1).ToArray()); 尽管如此,如何才能删除文本文件的开头?而不是行。采取,您可以使用行。跳过,如: var lines = File.ReadAllLines("test.txt");

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

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

尽管如此,如何才能删除文本文件的开头?

而不是
行。采取
,您可以使用
行。跳过
,如:

var lines = File.ReadAllLines("test.txt");
File.WriteAllLines("test.txt", lines.Skip(1).ToArray());
尽管所使用的技术(读取所有文本并将所有内容写回)非常低效,但在开始时进行截断

关于有效方法:效率低下的原因是必须将整个文件读入内存。另一种方法是在流中查找并将流复制到另一个输出文件,删除原始文件,然后重命名旧文件。这将是同样快,但消耗更少的内存

最后截断文件要容易得多。您只需找到trunaction位置并调用
FileStream.SetLength()


Skip
从序列的开头删除给定数量的元素
Take
从序列末尾除去给定数量的元素以外的所有元素。

这里有一个替代方案:

        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);
                }
            }
        }
使用(var stream=File.OpenRead(“C:\\yourfile”))
{
var items=newlinkedlist();
使用(变量读取器=新的流读取器(流))
{
reader.ReadLine();//跳过一行
弦线;
而((line=reader.ReadLine())!=null)
{
//在这里进行实际处理要好得多
items.AddLast(行);
}
}
}
更新

如果您需要一个
IEnumerable
,并且不想浪费内存,您可以这样做:

    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.
        }
    }
公共静态IEnumerable GetFileLines(字符串文件名)
{
使用(var stream=File.OpenRead(文件名))
{
使用(变量读取器=新的流读取器(流))
{
reader.ReadLine();//跳过一行
弦线;
而((line=reader.ReadLine())!=null)
{
收益率回归线;
}
}
}
}
静态void Main(字符串[]参数)
{
foreach(GetFileLines中的var行(“C:\\yourfile.txt”))
{
//用这条线做点什么。
}
}

从文本文件中删除第一行

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();
System.IO.StreamReader文件=新的System.IO.StreamReader(文件路径);
字符串数据=file.ReadToEnd();
file.Close();

data=Regex.Replace(数据,也可以在一行中完成

File.WriteAllLines(origialFilePath,File.ReadAllLines(originalFilePath).Skip(1));

假设您将文件路径作为参数传递给函数。

这是无效的是-但是有没有办法截断文件的开头?是的,您只是按照我的回答中的说明省略了写入部分。@ssg:如果您省略了写入部分,那么文件是如何更新的?我假设我缺少了一些东西…@Chris you can't“truncate”“在文件的开头,您必须读取整个文件,然后只写回所需的部分(在本例中,除第一行外的所有内容)。如果没有行,会发生什么?聪明。很有道理。使用LinkedList比仅使用普通列表有什么好处?链表不会在内部分配或重新分配数组。可能不是您要寻找的答案,但将表示第一行的字节替换为NULL如何?下次您可以使用File.ReadAl在这种情况下,它将跳过所有初始的空bytesRegex真是太过分了
File.WriteAllLines(origialFilePath,File.ReadAllLines(originalFilePath).Skip(1));