我想替换文本文件中的一个特定行。最简单的解决方案是:
public void ModifyFile(string path, int line, string targetText) {
var lines = File.ReadAllLines(path);
lines[line] = targetText;
File.WriteAllLines(path, lines);
}
问题是,如果文件足够大,我会得到System.OutOfMemoryException
因为File.ReadAllLines()尝试将整个文件加载到内存中,而不是逐行加载。
我知道还有另一种方法可以用更少的内存成本读取特定的行:
var line = File.ReadLines(path).Skip(line-1).Take(1).ToString();
如何替换文件中的那一行?
我正在寻找像FileStream.Write Method这样的东西:
var writer = File.OpenWrite(path);
writer.Write(Encoding.UTF8.GetBytes(targetText),
offset, Encoding.UTF8.GetByteCount(targetText));
但很难知道offset
。
有更好的方法吗?
答案建议的临时文件解决方案效果很好
同时,我想知道,如果我知道line
是一个小数字(行&lt; 100 <),有没有创建临时文件的特定案例解决方案强>让我们说)?如果我想更改具有100米行的文本文件中的第10行,则必须有更好的解决方案。
答案 0 :(得分:4)
您可以使用流一次读取一行文件,并将内容复制到新文件中,或者使用备份名称重命名旧文件,然后处理;
string line;
int couinter = 0;
// Read the file and display it line by line.
System.IO.StreamReader reader = new System.IO.StreamReader(path);
System.IO.StreamWriter writer = new System.IO.StreamWriter(new_path);
while((text = reader.ReadLine()) != null)
{
// Check for your content and replace if required here
if ( counter == line )
text = targetText;
writer.writeline(text);
counter++;
}
reader.Close();
writer.Close();
答案 1 :(得分:2)
您可以使用StreamReader(提供ReadLine方法)打开FileStrem。现在逐行读取并逐行将输出写入临时文件。当您在所需的线上时,只需更改线。