修改内存中的文件流

时间:2015-04-03 17:07:15

标签: c#

我正在使用StreamReader fileReader = File.OpenText(filePath)阅读文件。我想在内存中修改文件中的一行,并将修改后的流推送到另一种方法。

我想避免的是将整个文件读入字符串并修改字符串(不缩放)。我还想避免修改实际文件。

有这么简单的方法吗?

2 个答案:

答案 0 :(得分:1)

在.Net框架中没有内置的方法。

StreamStreamReader / 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可以同时访问这两个流。您也可以同时操纵读/写位置。