首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C#中删除文本文件中的一行?

如何在C#中删除文本文件中的一行?
EN

Stack Overflow用户
提问于 2009-03-21 07:19:31
回答 11查看 183.2K关注 0票数 52

我有一个问题:如何在C#中从文本文件中删除一行?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-03-21 07:24:12

读取文件,删除内存中的行,并将内容放回文件中(覆盖)。如果文件很大,您可能需要逐行读取它,然后创建一个临时文件,然后替换原来的文件。

票数 32
EN

Stack Overflow用户

发布于 2009-03-21 07:29:25

对于非常大的文件,我会这样做

代码语言:javascript
复制
string tempFile = Path.GetTempFileName();

using(var sr = new StreamReader("file.txt"))
using(var sw = new StreamWriter(tempFile))
{
    string line;

    while((line = sr.ReadLine()) != null)
    {
         if(line != "removeme")
             sw.WriteLine(line);
    }
}

File.Delete("file.txt");
File.Move(tempFile, "file.txt");

更新我最初写这篇文章是在2009年,我想更新一下可能会很有趣。现在,您可以使用LINQ and deferred execution来完成上述任务

代码语言:javascript
复制
var tempFile = Path.GetTempFileName();
var linesToKeep = File.ReadLines(fileName).Where(l => l != "removeme");

File.WriteAllLines(tempFile, linesToKeep);

File.Delete(fileName);
File.Move(tempFile, fileName);

上面的代码与第一个示例几乎完全相同,逐行读取,同时在内存中保留最少量的数据。

不过,免责声明可能是合理的。因为我们在这里讨论的是文本文件,所以很少需要使用磁盘作为中间存储介质。如果您不是在处理非常大的日志文件,那么将内容读取到内存中应该是没有问题的,并且可以避免处理临时文件。

代码语言:javascript
复制
File.WriteAllLines(fileName, 
    File.ReadLines(fileName).Where(l => l != "removeme").ToList());

请注意,.ToList在这里对于强制立即执行至关重要。还要注意,所有示例都假定文本文件是UTF-8编码的。

票数 93
EN

Stack Overflow用户

发布于 2009-03-21 07:26:30

我同意John Saunders的观点,这并不是C#特有的。然而,为了回答你的问题:你基本上需要重写这个文件。有两种方法可以做到这一点。

  • 将整个文件读入内存(例如,使用File.ReadAllLines)
  • Remove将有问题的行(在本例中,将字符串数组转换为List<string>,然后删除该行可能是最简单的)
  • 将所有其余行写回(例如,使用File.WriteAllLines) -可能会再次使用ToArray

List<string>转换为字符串数组

这意味着你必须知道你有足够的内存。另一种选择:

File.CreateText)

  • Read

  • 打开输入文件和新的输出文件(作为TextReader/TextWriter,例如File.OpenTextTextReader.ReadLine)-如果你不想删除它,把它写到输出文件中你已经读完了所有的行,关闭读取器和写入器(如果你对两者都使用using语句,这将发生在你想用输出替换输入的时候,删除输入文件,然后将输出文件移动到位。
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/668907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档