23

HTMLファイルのコンテンツの一部を置き換えると、String.Replaceが正しく機能しないようです。たとえば、String.Replaceは次のように置き換え</body></html>られblah blah blah </body></html> html> ます。2番目の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 未満のもの。コンテンツ全体をメモリにロードします。非常に大きなファイルがある場合は、OutOfMemoryException を防ぐために、一度に数百 KB ずつストリーミングする必要がある場合があります。検索文字列が分割されているかどうかを確認するには、各チャンク間の区切りも確認する必要があるため、これは少し複雑になります。

于 2010-12-02T21:06:15.787 に答える
14

ここに問題はありませんstring.Replace

問題なのかというと、ファイルを上書きしているのに切り捨てていないということです...したがって、書き込みコードを

sw.WriteLine("Start");

「開始」が表示され、次にファイルの残りの部分が表示されます。

File.ReadAllText代わりにを使用することをお勧めしますFile.WriteAllText(からパスを取得しますFileInfo)。そのように:

  • 単に上書きするのではなく、ファイルを完全に置き換えます
  • リーダー/ライター/ストリームを適切に閉じることを心配する必要はありません(現在は行っていません-例外が発生した場合は、リーダーまたはライターを開いたままにします)

本当にFileInfoメソッドを使用する場合は、FileInfo.Open(FileMode.Create)ファイルを切り捨てるを使用します。

于 2010-12-02T21:04:04.157 に答える