txt texto reemplazar buscar archivo c# file-io streamwriter fileinfo

texto - c#reemplazar cadena dentro de archivo



buscar y reemplazar texto c# (2)

String.Replace no parece funcionar correctamente cuando se reemplaza una parte del contenido de un archivo HTML. Por ejemplo, String.Replace reemplaza </body></html> con blah blah blah </body></html> html> - observe que la segunda etiqueta de cierre HTML no se cierra correctamente y, por lo tanto, aparece cuando la página se procesa en el navegador por el usuario.

¿Alguien sabe por qué no está funcionando como se esperaba?

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


No hay nada malo con la string.Replace . string.Replace aquí.

Lo que está mal es que estás sobreescribiendo el archivo pero no truncándolo ... así que si cambiaste tu código de escritura a solo

sw.WriteLine("Start");

Vería "Inicio" y luego el resto del archivo.

Yo recomendaría que use File.ReadAllText y File.WriteAllText en File.WriteAllText lugar (tome la ruta de FileInfo ). De esa manera:

  • Reemplazará por completo el archivo, en lugar de sobrescribirlo
  • No tiene que preocuparse por cerrar correctamente el lector / escritor / transmisión (lo que no está haciendo ahora; si ocurre una excepción, está dejando abierto el lector o el escritor)

Si realmente desea utilizar los métodos FileInfo, use FileInfo.Open(FileMode.Create) que truncará el archivo.


Podría reescribir tu bit de código así:

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

Debo señalar que esta solución está bien para archivos de tamaño razonable. Dependiendo del hardware, cualquier cosa en unas pocas decenas de MB. Carga todo el contenido en la memoria. Si tiene un archivo realmente grande, puede necesitar transmitirlo a través de unos cientos de KB a la vez para evitar una OutOfMemoryException. Eso hace que las cosas sean un poco más complicadas, ya que también necesitarías verificar el descanso entre cada fragmento para ver si dividir tu cadena de búsqueda.