2015-04-03 73 views
1

我正在使用StreamReader fileReader = File.OpenText(filePath)讀取文件。我想修改內存中文件的一行,並將修改後的流推送到另一個方法。修改內存中的文件流

我想避免的是將整個文件讀入字符串並修改字符串(不縮放)。我也想避免修改實際的文件。

有沒有一個簡單的方法來做到這一點?

+1

您可以在調用包裝的閱讀器之後爲每個操作創建包裝器StreamReader並更新數據。 – 2015-04-03 17:19:35

+0

這是我的備份計劃。我希望有這樣做的內置方式。 – user472875 2015-04-03 17:21:59

+0

不,在.Net Framework中沒有過濾閱讀器。 – 2015-04-03 17:24:32

回答

1

在.Net框架中沒有內建的方法。

StreamStreamReader/StreamWriter類被設計爲在必要時鏈接(如GZipStream包裝流以壓縮它)。因此,您可以在調用包裝閱讀器之後爲每個操作創建包裝器StreamReader並更新數據。

0

您可以同時打開兩個流 - 一個用於讀取,一個用於寫入。我測試了簡單的代碼工作,但不知道這是你想要什麼:

// "2.bar\r\n" will be replaced by "!!!!!\r\n" 
File.WriteAllText("test.txt", 
@"1.foo 
2.bar 
3.fake"); 

// open inputStream for StreamReader, and open outputStream for StreamWriter 
using (var inputStream = File.Open("test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
using (var reader = new StreamReader(inputStream)) 
using (var outputStream = File.Open("test.txt", FileMode.Open, FileAccess.Write, FileShare.Read)) 
using (var writer = new StreamWriter(outputStream)) 
{ 
    var position = 0L; // track the reading position 
    var newLineLength = Environment.NewLine.Length; 
    while (!reader.EndOfStream) 
    { 
     var line = reader.ReadLine(); 
     // your particular conditions here. 
     if (line.StartsWith("2.")) 
     { 
      // seek line start position 
      outputStream.Seek(position, SeekOrigin.Begin); 
      // replace by something, 
      // but the length should be equal to original in this case. 
      writer.WriteLine(new String('!', line.Length)); 
     } 
     position += line.Length + newLineLength; 
    } 
} 
/* as a result, test.txt will be: 
1.foo 
!!!!! 
3.fake 
*/ 

正如你可以看到,這兩個流可以通過的StreamReader和StreamWriter在同一時間訪問。你也可以操作讀/寫位置。