我正在使用StreamReader fileReader = File.OpenText(filePath)
讀取文件。我想修改內存中文件的一行,並將修改後的流推送到另一個方法。修改內存中的文件流
我想避免的是將整個文件讀入字符串並修改字符串(不縮放)。我也想避免修改實際的文件。
有沒有一個簡單的方法來做到這一點?
我正在使用StreamReader fileReader = File.OpenText(filePath)
讀取文件。我想修改內存中文件的一行,並將修改後的流推送到另一個方法。修改內存中的文件流
我想避免的是將整個文件讀入字符串並修改字符串(不縮放)。我也想避免修改實際的文件。
有沒有一個簡單的方法來做到這一點?
在.Net框架中沒有內建的方法。
Stream
和StreamReader
/StreamWriter
類被設計爲在必要時鏈接(如GZipStream
包裝流以壓縮它)。因此,您可以在調用包裝閱讀器之後爲每個操作創建包裝器StreamReader並更新數據。
您可以同時打開兩個流 - 一個用於讀取,一個用於寫入。我測試了簡單的代碼工作,但不知道這是你想要什麼:
// "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在同一時間訪問。你也可以操作讀/寫位置。
您可以在調用包裝的閱讀器之後爲每個操作創建包裝器StreamReader並更新數據。 – 2015-04-03 17:19:35
這是我的備份計劃。我希望有這樣做的內置方式。 – user472875 2015-04-03 17:21:59
不,在.Net Framework中沒有過濾閱讀器。 – 2015-04-03 17:24:32