c#替换文件中的字符串

Posted

技术标签:

【中文标题】c#替换文件中的字符串【英文标题】:c# replace string within file 【发布时间】:2011-05-19 09:31:15 【问题描述】:

在替换 html 文件的一部分内容时,String.Replace 似乎无法正常工作。例如,String.Replace 将 </body></html> 替换为 blah blah blah </body></html> html> - 请注意第二个 HTML 结束标记未正确关闭,因此当用户在浏览器中呈现页面时会显示出来。

有人知道为什么它没有按预期工作吗?

StreamReader sr = fi.OpenText;
String fileContents = sr.ReadToEnd();
sr.close();
fileContents = fileContents.Replace("<body>", "<body onload='jsFx();' />");
fileContents = fileContents.Replace("</body>","blah blah blah </body>");

StreamWriter sw = new StreamWriter(fi.OpenWrite());
sw.WriteLine(contents);
sw.close();

【问题讨论】:

你能提供一个你的源文件的例子吗?您提交的代码应该按照您的描述工作。我看不出有什么理由让你得到一个额外的`html>`位... 输入文件中是否已经存在该无关标签?我还在代码示例中注意到您有一个自动关闭的正文标签,对吗? Nate - 感谢您的快速回复和清理。不是实际代码,但足够接近我的观点。 【参考方案1】:

我可能会像这样重写你的代码:

var fileContents = System.IO.File.ReadAllText(@"C:\File.html");

fileContents = fileContents.Replace("<body>", "<body onload='jsFx();' />"); 
fileContents = fileContents.Replace("</body>","blah blah blah </body>"); 

System.IO.File.WriteAllText(@"C:\File.html", fileContents);

我应该注意,这种解决方案适用于大小合理的文件。取决于硬件,任何低于几十 MB 的东西。它将全部内容加载到内存中。如果您有一个非常大的文件,您可能需要一次通过几百 KB 流式传输它以防止 OutOfMemoryException。这让事情变得有点复杂,因为您还需要检查每个块之间的中断以查看是否拆分了您的搜索字符串。

【讨论】:

此功能的一个重要特点是,它是我在任何地方看到的唯一答案,它实际上保留了与原始文件中完全相同的换行符。我正在阅读一个 xaml 文件,这种方法意味着元素中的新行字符被分成几行保持不变!【参考方案2】:

string.Replace 这里没有错。

的错误在于您正在覆盖文件但没有截断它......所以如果您将编写代码更改为只是

sw.WriteLine("Start");

您会看到“开始”,然后是文件的其余部分。

我建议您改用File.ReadAllTextFile.WriteAllText(从FileInfo 获取路径)。那样:

它将完全替换文件,而不仅仅是覆盖 您无需担心正确关闭读取器/写入器/流(您现在没有这样做 - 如果发生异常,您将打开读取器或写入器)

如果您真的想使用 FileInfo 方法,请使用FileInfo.Open(FileMode.Create),它将截断文件。

【讨论】:

乔恩 - 感谢您的快速回答和解释。请解释为什么我不需要在上面的示例中关闭读取器/写入器/流。 - 我意识到我提供的代码很脏。它不是从开发中复制的,而只是试图解决我的问题。 @Joey:只有在没有异常的情况下才关闭它们。无论发生什么,你都应该使用using 语句来处理它们——它相当于try/finally。 @Joey 现在有点晚了,但请注意,您的“新”开始 标签中有一个额外的 / ,终止了 xml 块。它应该有结束斜线:

以上是关于c#替换文件中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中将字符串中的“\\”替换为“\”

(C#) 替换字符串变量中的字符

C#中的字符串替换变音符号[重复]

如何用c#中的变量值替换字符串?

C#中字符串中的特殊序列替换

C# 中的引号字符串替换集