C# 如何覆盖同一文本文件中的文本

C# 如何覆盖同一文本文件中的文本,c#,console-application,streamreader,C#,Console Application,Streamreader,我正在与使用控制台应用程序进行一些更改来覆盖文本文件进行斗争。在这里,我逐行阅读文件。有人能帮我吗 StreamReader sr = new StreamReader(@"C:\abc.txt"); string line; line = sr.ReadLine(); while (line != null) { if (line.StartsWith("<")) { if (line.IndexOf('{') == 29) { string s =

我正在与使用控制台应用程序进行一些更改来覆盖文本文件进行斗争。在这里,我逐行阅读文件。有人能帮我吗

StreamReader sr = new StreamReader(@"C:\abc.txt");
string line;
line = sr.ReadLine();

while (line != null)
{
  if (line.StartsWith("<"))
  {
    if (line.IndexOf('{') == 29)
    {
      string s = line;
      int start = s.IndexOf("{");
      int end = s.IndexOf("}");
      string result = s.Substring(start+1, end - start - 1);
      Guid g= Guid.NewGuid();
      line = line.Replace(result, g.ToString());
      File.WriteAllLines(@"C:\abc.txt", line );
    }
  }
  Console.WriteLine(line);

  line = sr.ReadLine();
}
//close the file
sr.Close();
Console.ReadLine();
这里我得到的错误文件已经被另一个进程打开

请帮助我,任何人。主要任务是通过修改覆盖同一个文件

您需要一个流, 打开它进行阅读和写作

FileStream fileStream = new FileStream(
      @"c:\words.txt", FileMode.OpenOrCreate, 
      FileAccess.ReadWrite, FileShare.None);
现在可以使用fileStream.Read和fileStream.Write方法

请参阅此链接以进行扩展讨论


问题是您试图写入StreamReader使用的文件。您必须关闭它,或者最好使用using语句,即使出现错误也会处理/关闭它

using(StreamReader sr = new StreamReader(@"C:\abc.txt"))
{
    // ...
}
File.WriteAllLines(...);
File.writeAllines还将所有行写入文件,而不仅仅是当前行,因此在循环中这样做是没有意义的

我可以建议您使用不同的方法来读取文本文件的行吗?您可以使用File.ReadAllLines将所有行读入字符串[],也可以使用File.ReadLines,其工作原理类似于StreamReader,通过延迟读取所有行

这里有一个版本做相同的,但使用更可读的?LINQ查询:

var lines = File.ReadLines(@"C:\abc.txt")
    .Where(l => l.StartsWith("<") && l.IndexOf('{') == 29)
    .Select(l => 
    {
        int start = l.IndexOf("{");
        int end = l.IndexOf("}", start);
        string result = l.Substring(start + 1, end - start - 1);
        Guid g = Guid.NewGuid();
        return l.Replace(result, g.ToString());
    }).ToList();
File.WriteAllLines(@"C:\abc.txt", lines);

问题是,您打开了该文件,并在写入该文件的同时读取了同一文件。但你应该做的是

从文件中读取更改 关闭文件 将内容写回文件 所以你的代码应该是

List<string> myAppendedList = new List<string>();
using (StreamReader sr = new StreamReader(@"C:\abc.txt"))

{
    string line;
    line = sr.ReadLine();

    while (line != null)
    {
        if (line.StartsWith("<"))
        {
            if (line.IndexOf('{') == 29)
            {
                string s = line;
                int start = s.IndexOf("{");
                int end = s.IndexOf("}");
                string result = s.Substring(start + 1, end - start - 1);
                Guid g = Guid.NewGuid();
                line = line.Replace(result, g.ToString());
                myAppendedList.Add(line);

            }
        }
        Console.WriteLine(line);

        line = sr.ReadLine();
    }
}

if(myAppendedList.Count > 0 )
    File.WriteAllLines(@"C:\abc.txt", myAppendedList);

您应该使用streamreader读取所有行,将它们存储在一组行中,然后在再次开始写入文件之前关闭streamreader。