阅读和更改文件

时间:2012-10-13 13:21:15

标签: c# .net

我正在使用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
    }
 }

在代码中有一个问题:如何将更改的行保存到我正在阅读的文件中并继续阅读?

4 个答案:

答案 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);