Подтвердить что ты не робот

С# заменить строку в файле

String.Replace, похоже, не работает должным образом при замене части содержимого файла HTML. Например, 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();
4b9b3361

Ответ 1

Я могу переписать свой бит кода следующим образом:

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);

Я должен отметить, что это решение отлично подходит для файлов разумного размера. В зависимости от аппаратного обеспечения, любая вещь под несколькими десятками МБ. Он загружает все содержимое в память. Если у вас действительно большой файл, вам может понадобиться передать его через несколько сотен КБ за раз, чтобы предотвратить исключение OutOfMemoryException. Это делает вещи немного сложнее, так как вам нужно также проверить разрыв между каждым фрагментом, чтобы увидеть, разделили ли строку поиска.

Ответ 2

Нет ничего плохого в string.Replace здесь.

Неправильно то, что вы перезаписываете файл, но не усекаете его... поэтому, если вы изменили свой код записи только на

sw.WriteLine("Start");

вы увидите "Пуск", а затем остальную часть файла.

Я бы рекомендовал вам использовать File.ReadAllText и File.WriteAllText вместо этого (введите путь от FileInfo). Таким образом:

  • Он полностью заменит файл, а не просто перезаписывает
  • Вам не нужно беспокоиться о правильном закрытии чтения/записи/потока (что вы не делаете сейчас - если возникает исключение, вы оставляете читателя или писателя открытым)

Если вы действительно хотите использовать методы FileInfo, используйте FileInfo.Open(FileMode.Create), который усекает файл.