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

时间:2013-12-20 12:09:29

标签: 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 = 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();

我在这里收到错误文件已被其他进程打开

请帮助我,任何人。 主要任务是覆盖相同的texfile并进行修改

3 个答案:

答案 0 :(得分:0)

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

FileStream fileStream = new FileStream(
      @"c:\words.txt", FileMode.OpenOrCreate, 
      FileAccess.ReadWrite, FileShare.None);

现在您可以使用fileStream.Read() and fileStream.Write()方法

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

How to both read and write a file in C#

答案 1 :(得分:0)

问题是您正在尝试写入StreamReader使用的文件。你必须关闭它 - 或者 - 更好 - 使用using - 语句即使在出错时也会处理/关闭它。

using(StreamReader sr = new StreamReader(@"C:\abc.txt"))
{
    // ...
}
File.WriteAllLines(...);

File.WriteAllLines还将所有行写入文件,而不仅仅是currrent行,因此在循环中执行它是没有意义的。

我可以建议您使用不同的方法来读取文本文件的行吗?您可以使用File.ReadAllLines将所有行读入string[]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);

答案 2 :(得分:0)

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

  1. 从文件中读取更改
  2. 关闭文件
  3. 将内容写回文件
  4. 所以你的代码应该像

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