2013-12-20 58 views
1

我在與使用控制檯應用程序進行一些更改覆蓋文本文件的鬥爭。在這裏我正在逐行閱讀文件。誰能幫我。如何覆蓋同一個文本文件中的文本

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文件

+0

您應該讀取所​​有使用流讀取器的行,將它們存儲在行集合中,然後在開始寫入fi之前關閉流讀取器再次。 –

回答

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#

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

謝謝蒂姆,它的工作。 – user2477724

0

問題是,你已經打開了文件,並在你在寫的同時從同一個文件中讀取文件。但是,你應該做的是,

  1. 從文件中讀取
  2. 更改關閉文件
  3. 寫的內容迴文件

所以,你的代碼應該像

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