我正在使用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