2010-12-02 5 views
23

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^