2010-12-02 12 views
23

HTMLファイルのコンテンツの一部を置き換えるときにString.Replaceが正しく動作しないようです。たとえば、String.Replaceは</body></html>blah blah blah </body></html> html>に置き換えます.2番目のHTML終了タグが正しく閉じられていないことに注意してください。ページがユーザーによってブラウザにレンダリングされたときに表示されます。c#ファイル内の文字列を置換

誰かが意図したとおりに動作しない理由を知っていますか?

+1

ソースファイルの例を挙げることはできますか? *あなたが提出したコードはあなたが記述した通りに動作するはずです*。余分な 'html>'ビットを取得する理由はありません。 – Nate

+1

この無関係なタグが入力ファイルに既に存在する可能性はありますか?また、コード例では、自動閉鎖ボディータグがあることに気付きました。 – MrEyes

+0

ネイト - 迅速な返信とクリーンアップに感謝します。実際のコードではありませんが、私の意見を理解するには十分に近いです。 – Joey

答えて

12

ここではstring.Replaceで何か問題はありません。間違っている何

は、ファイルを上書きしますが、それを切り捨てていないということです...ので、あなたがちょうど

sw.WriteLine("Start"); 

あなたの文章のコードを変更する場合は、「スタート」を参照してからだろう残りのファイル

代わりにFile.ReadAllTextFile.WriteAllTextを使用することをお勧めします(FileInfoのパスを使用してください)。その方法:

  • それは完全にだけではなく、
  • を上書きするのあなたは、あなたが今やっていないいる(正しくリーダー/ライター/ストリームをクローズ心配する必要はありません、ファイルを置き換えます - 場合あなた本当にがファイルを切り捨てるなるFileInfo.Open(FileMode.Create)を使用して、のFileInfoメソッドを使用する場合は例外)は、リーダーやライターのオープンを残している、

を発生します。

+0

良いキャッチ..... – Nate

+0

ジョン - 迅速な答えと説明をありがとう。上記の例で私がリーダー/ライター/ストリームを閉じる必要がない理由を説明してください。 - 私が提供したコードが汚いことに気付きました。それは開発からコピーされたものではなく、単に私の質問を出そうとしています。 – Joey

+0

@Joey:例外がない場合にのみ閉じます。何が起こったとしてもそれらを処分するには 'using'ステートメントを使うべきです - それはtry/finallyと同等です。 –

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以下のものがあります。内容全体をメモリにロードします。非常に大きなファイルがある場合は、OutOfMemoryExceptionを防ぐために、一度に数百KBまでストリーミングする必要があります。これは、あなたの検索文字列を分割するかどうかを確認するために各チャンク間の区切りをチェックする必要があるので、もう少し複雑になります。

関連する問題