我正在使用StreamReader fileReader = File.OpenText(filePath)
阅读文件。我想在内存中修改文件中的一行,并将修改后的流推送到另一种方法。
我想避免的是将整个文件读入字符串并修改字符串(不缩放)。我还想避免修改实际文件。
有这么简单的方法吗?
答案 0 :(得分:1)
在.Net框架中没有内置的方法。
Stream
和StreamReader
/ StreamWriter
类被设计为在必要时进行链接(例如GZipStream
包裹流来压缩它)。因此,您可以在调用包装读取器后为每个操作创建包装器StreamReader并更新数据。
答案 1 :(得分: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可以同时访问这两个流。您也可以同时操纵读/写位置。