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));