2010-12-02 103 views
23

替換HTML文件內容的一部分時,String.Replace似乎無法正常工作。例如,String.Replace將</body></html>替換爲blah blah blah </body></html> html> - 注意,第二個HTML結束標記未正確關閉,因此在用戶在瀏覽器中呈現頁面時顯示此標記。c#替換文件內的字符串

任何人都知道爲什麼它不按預期工作?

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(); 
+1

你能舉一個你的源文件的例子嗎?您提交的代碼*應該*如您所描述的那樣工作。我沒有看到任何理由,你會得到一個額外的`html>`位...... – Nate 2010-12-02 21:01:45

+1

有沒有機會,無關的標籤已經在輸入文件中?另外我注意到在代碼示例中,您有一個自動封閉的身體標記,是嗎? – MrEyes 2010-12-02 21:05:32

回答

12

string.Replace這裏沒有什麼錯。

什麼錯誤是,你覆蓋文件,但不截斷它......所以如果你改變了你寫代碼,只是

sw.WriteLine("Start"); 

你會看到「開始」,然後文件的其餘部分。

我建議您使用File.ReadAllTextFile.WriteAllText來代替(從FileInfo開始)。這樣的話:

  • 它將完全替換文件,而不是隻覆蓋
  • 您不必擔心正確關閉讀/寫/流(你現在不這樣做 - 如果發生異常時,我們留給讀者或作家打開)

如果你真的使用FileInfo的方法,使用FileInfo.Open(FileMode.Create)將截斷該文件。

52

我可能會重寫你的代碼有點像這樣:

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。這會讓事情變得更復雜一些,因爲您還需要檢查每個塊之間的中斷,以查看是否拆分搜索字符串。