我正在使用C#和类TextReader
读取文件TextReader reader = new StreamReader(stream);
string line;
while ((line = reader.ReadLine()) != null)
{
if (someCondition)
{
// I want to change "line" and save it into the file I'm reading from
}
}
在代码中有一个问题:如何将更改的行保存到我正在阅读的文件中并继续阅读?
答案 0 :(得分:3)
快速而肮脏的解决方案是:
TextReader reader = new StreamReader(stream);
string line;
StringBuilder sb = new StringBuilder();
while ((line = reader.ReadLine()) != null)
{
if (someCondition)
{
//Change variable line as you wish.
}
sb.Append(line);
}
using (StreamWriter sw = new StreamWriter("filePath"))
{
sw.Write(sb.ToString());
}
或
TextReader reader = new StreamReader(stream);
string line;
String newLines[];
int index = 0;
while ((line = reader.ReadLine()) != null)
{
if (someCondition)
{
//Change variable line as you wish.
}
newLines[index] = line;
index++;
}
using (StreamWriter sw = new StreamWriter("filePath"))
{
foreach (string l in newLines)
{
sw.WriteLine(l);
}
}
如果记忆太重要,你也可以试试:
TextReader reader = new StreamReader(stream);
string line;
while ((line = reader.ReadLine()) != null)
{
if (someCondition)
{
//Change variable line as you wish.
}
using (StreamWriter sw = new StreamWriter("filePath"))
{
sw.WriteLine(line);
}
}
答案 1 :(得分:2)
最简单的方法是编写一个新文件,然后在完成后,用新文件替换旧文件。这样你只能在一个文件中写入。
如果您尝试在同一文件中读/写,当您要插入的内容与其替换的内容的大小不完全相同时,您将遇到问题。
文本文件没有什么神奇之处。它们只是表示文本编码中字符的字节流。文件中没有行概念,只是换行符形式的分隔符。
答案 2 :(得分:2)
一个非常简单的解决方案
void Main()
{
var lines = File.ReadAllLines("D:\\temp\\file.txt");
for(int x = 0; x < lines.Length; x++)
{
// Of course this is an example of the condtion
// you should implement your checks
if(lines[x].Contains("CONDITION"))
{
lines[x] = lines[x].Replace("CONDITION", "CONDITION2");
}
}
File.WriteAllLines("D:\\temp\\file.txt", lines);
}
缺点是由内存线引起的内存使用,但是,如果我们保持在50MB左右,它应该由现代PC毫不费力地处理。
答案 3 :(得分:2)
如果文件不是太大,您只需重写整个文件:
var lines = File.ReadAllLines(path)
.Where(l => someCondition);
File.WriteAllLines(path, lines);