我有一个问题:如何在C#中从文本文件中删除一行?
发布于 2009-03-21 07:24:12
读取文件,删除内存中的行,并将内容放回文件中(覆盖)。如果文件很大,您可能需要逐行读取它,然后创建一个临时文件,然后替换原来的文件。
发布于 2009-03-21 07:29:25
对于非常大的文件,我会这样做
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来完成上述任务
var tempFile = Path.GetTempFileName();
var linesToKeep = File.ReadLines(fileName).Where(l => l != "removeme");
File.WriteAllLines(tempFile, linesToKeep);
File.Delete(fileName);
File.Move(tempFile, fileName);上面的代码与第一个示例几乎完全相同,逐行读取,同时在内存中保留最少量的数据。
不过,免责声明可能是合理的。因为我们在这里讨论的是文本文件,所以很少需要使用磁盘作为中间存储介质。如果您不是在处理非常大的日志文件,那么将内容读取到内存中应该是没有问题的,并且可以避免处理临时文件。
File.WriteAllLines(fileName,
File.ReadLines(fileName).Where(l => l != "removeme").ToList());请注意,.ToList在这里对于强制立即执行至关重要。还要注意,所有示例都假定文本文件是UTF-8编码的。
发布于 2009-03-21 07:26:30
我同意John Saunders的观点,这并不是C#特有的。然而,为了回答你的问题:你基本上需要重写这个文件。有两种方法可以做到这一点。
File.ReadAllLines)List<string>,然后删除该行可能是最简单的)File.WriteAllLines) -可能会再次使用ToArray将List<string>转换为字符串数组
这意味着你必须知道你有足够的内存。另一种选择:
File.CreateText)
TextReader/TextWriter,例如File.OpenText和TextReader.ReadLine)-如果你不想删除它,把它写到输出文件中你已经读完了所有的行,关闭读取器和写入器(如果你对两者都使用using语句,这将发生在你想用输出替换输入的时候,删除输入文件,然后将输出文件移动到位。https://stackoverflow.com/questions/668907
复制相似问题