¿Cómo puedo leer el archivo XML y editar y guardar el mismo archivo? El problema que recibo es "el archivo está en uso" obviamente porque lo estoy leyendo. ¿No lo leo o lo leo de otra manera?

La idea básica de lo que estoy haciendo es leer una base de datos SQL y obtener el nuevo valor escrito allí, luego actualizar el archivo XML cuando el nuevo cambio.

¿La opción XmlTextWriter no parece la opción de escritura y es para escribir un nuevo archivo XML?

XmlTextReader reader = new XmlTextReader(@"C:\Users\Pavle\Desktop\Settings.xml");
XmlDocument doc = new XmlDocument();
doc.Load(reader);
doc.SelectSingleNode("/config/Settings/SleepNumber").InnerText = "new2 text";
doc.Save(@"C:\Users\Pavle\Desktop\Settings.xml");
1
Pavle Stojanovic 9 jul. 2021 a las 09:27

3 respuestas

La mejor respuesta

Su problema es que debe cerrar el lector antes de poder escribir el archivo.

Tengo dos sugerencias para ti.

Primero, intente usar la nueva biblioteca LINQ-to-Xml en su lugar.

Entonces podrías hacer esto:

string filename = @"C:\Users\Pavle\Desktop\Settings.xml";
XDocument doc2 = XDocument.Load(filename);
doc2.Root.Element("Settings").Element("SleepNumber").Value = "new2 text";
doc2.Save(filename);

En segundo lugar, es típico escribir un archivo nuevo, eliminar el antiguo y luego cambiar el nombre del nuevo por el antiguo para asegurarse siempre de tener un archivo válido en todo momento en el disco. En su código, si la escritura falla, ha destruido su archivo original. Esa es una mala idea.

2
Enigmativity 9 jul. 2021 a las 06:39

Utilice Load(string filename) método que toma un nombre de archivo como parámetro en lugar de un lector de texto si lee archivos en el disco.

Si eso no es posible, utilice el enfoque descrito por Mark Russinovich en el libro de Windows Internals: Safe Saving. Dice:

  1. Guardar en un nuevo archivo temporal
  2. Cerrar el archivo original
  3. Eliminar el archivo original
  4. Cambie el nombre del archivo temporal al nombre del archivo original

Si lo hace, el controlador del sistema de archivos NTFS notará la operación y conservará las partes relevantes de las marcas de tiempo MAC originales del archivo. MAC es la abreviatura de modificado, accedido, creado.

Este enfoque también evita la pérdida de datos en caso de corte de energía u otros eventos graves: el archivo original estará disponible el mayor tiempo posible.

2
Thomas Weller 9 jul. 2021 a las 06:48

Puede intentar cerrar XmlTextReader antes de guardar. XmlTextReader bloquea el archivo hasta que se cierra.

1
Charlie Araya 9 jul. 2021 a las 06:30