我现在可以使用以下命令删除文本文件的最后一行:
var lines = System.IO.File.ReadAllLines("test.txt"); System.IO.File.WriteAllLines("test.txt", lines.Take(lines.Length - 1).ToArray());
尽pipe如何删除文本文件的开头?
取而代之的是,你可以改为使用lines.Skip
如:
var lines = File.ReadAllLines("test.txt"); File.WriteAllLines("test.txt", lines.Skip(1).ToArray());
尽管事实上使用的技术(读取所有的文本和写回所有的东西)是非常低效的。
关于高效的方式:低效率来自于将整个文件读入内存的必要性。 反过来,可以很容易地在一个流中查找并将流复制到另一个输出文件,删除原来的,并重命名旧的。 那一个会同样快,但消耗更少的内存。
最后截断一个文件要容易得多。 你可以找到trunaction的位置并调用FileStream.SetLength()
。
var lines = System.IO.File.ReadAllLines("test.txt"); System.IO.File.WriteAllLines("test.txt", lines.Skip(1).ToArray());
Skip
从序列的开头消除了给定数量的元素。 从序列的尾部消除除了给定数量的元素之外的所有元素。
这是一个替代方案:
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. } }
从文本文件中删除第一行
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();