c # заменить строку в файле - PullRequest
       26

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

23 голосов
/ 02 декабря 2010

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

Ответы [ 2 ]

56 голосов
/ 03 декабря 2010

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

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.Это немного усложняет задачу, поскольку вам также необходимо проверить разрыв между каждым фрагментом, чтобы увидеть, разделяет ли строка поиска.

14 голосов
/ 03 декабря 2010

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

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

sw.WriteLine("Start");

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

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

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

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

...