2015-04-03 71 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在同一时间访问。你也可以操作读/写位置。