在替换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();
答案 0 :(得分: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。这会使事情变得复杂一些,因为您还需要检查每个块之间的中断,看看是否拆分了搜索字符串。
答案 1 :(得分:14)
此处string.Replace
没有任何问题。
错误的原因是你覆盖了文件但没有截断它...所以如果你把你的编写代码改为
sw.WriteLine("Start");
你会看到“开始”,然后是文件的其余部分。
我建议您改为使用File.ReadAllText
和File.WriteAllText
(从FileInfo
开始)。那样:
如果确实想要使用FileInfo方法,请使用FileInfo.Open(FileMode.Create)
来截断文件。