用C#替换流中的字符串(不覆盖原始文件)

Pra*_*bhu 10 .net c# string filestream

我有一个文件,我打开流并传递给另一个方法.但是,我想在将流传递给另一个方法之前替换文件中的字符串.所以:

string path = "C:/...";
Stream s = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
//need to replace all occurrences of "John" in the file to "Jack" here.
CallMethod(s);
Run Code Online (Sandbox Code Playgroud)

不应修改原始文件,仅修改流.最简单的方法是什么?

谢谢...

Ser*_*rvy 12

如果你只是将文件作为行读入,然后处理这些,而不是强迫自己坚持使用Stream,只是因为流处理文本和二进制文件,并且需要能够读取一个字符,这会容易得多在一个时间(这使得这种替换非常困难).如果你一次读一整行(只要你没有多行替换),这很容易.

var lines = File.ReadLines(path)
    .Select(line => line.Replace("John", "Jack"));
Run Code Online (Sandbox Code Playgroud)

请注意,ReadLines仍然会对数据进行流式传输,并且Select不需要实现整个数据,因此在执行此操作时,您仍然不会将整个文件一次性读入内存.

如果您实际上不需要流式传输数据,则可以轻松地将其全部作为一个大字符串加载,执行替换,然后基于该字符串创建流:

string data = File.ReadAllText(path)
    .Replace("John", "Jack");
byte[] bytes = Encoding.ASCII.GetBytes(data);
Stream s = new MemoryStream(bytes);
Run Code Online (Sandbox Code Playgroud)

  • 如果文件是10gb怎么办? (4认同)
  • 我比这更喜欢这个答案. (4认同)
  • @JeroenvanLangen那么没问题.唯一的问题是如果单行文本是10GB.希望情况并非如此. (3认同)