23

替换 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();
4

2 回答 2

56

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

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。这使事情变得更加复杂,因为您还需要检查每个块之间的中断以查看是否拆分了您的搜索字符串。

于 2010-12-02T21:06:15.787 回答
14

这里没有什么问题string.Replace

问题是您正在覆盖文件但没有截断它......所以如果您将编写代码更改为

sw.WriteLine("Start");

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

我建议您使用File.ReadAllTextandFile.WriteAllText代替(从 中获取路径FileInfo)。那样:

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

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

于 2010-12-02T21:04:04.157 回答