2010-04-20 15 views

Respuesta

7

Si ahorra así, no debería tener ningún problema.

using (var file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)) 
{ 
    xmlDoc.Save(file); 
} 
+0

Dale una paliza de aproximadamente 3 segundos. Tener un voto positivo :) –

2

No creo que haya ninguna garantía de atomicidad. No deberías depender de eso.

+0

¿Qué hay de guardar un archivo temporal en su lugar y luego cambiarle el nombre? ¿El cambio de nombre se puede hacer atómicamente, o el sistema de archivos simplemente no funciona de esta manera? –

+0

Creo que un cambio de nombre haría el trabajo. Depende de la cantidad de "garantía" que desee. Si desea una garantía "real", entonces debe buscar en la documentación una declaración de que la operación es atómica. Es posible que necesite ver el código .NET utilizando Reflector para ver qué llamadas de Win32 hace, luego investigue si esas llamadas son atómicas. De lo contrario, probablemente sea lo suficientemente bueno para darse cuenta de que un cambio de nombre de un directorio a otro en el mismo volumen realmente solo crea una nueva entrada de directorio y elimina la anterior. No es complicado, y probablemente atómico. –

2

Escribir archivos no es, en general, atómico. Consulte Process Monitor para tener una idea de lo que expone el sistema operativo.

XmlDocument.Save (cadena) utiliza FileShare.Read. La solución de ChaosPandion especifica FileShare.None. Consulte la diferencia de System.IO.FileShare en MSDN.

0

Esta respuesta https://stackoverflow.com/a/487198/1429390 proporciona a AFAIK un tipo de atomicidad de una manera fácil de usar. El principio es escribir en un archivo temporal y brindarle a la persona que llama la oportunidad de cambiar el nombre del archivo (y cualquier otra cosa que desee) en el momento oportuno. De esa forma, lo que pueda suceder mientras se crea y completa el archivo no puede dañar un archivo posiblemente existente.

Actualización: excepto que no porque System.IO.File.Move() se rehúsa a sobreescribir. Ver https://stackoverflow.com/a/10305475/1429390 para una solución alternativa.

Cuestiones relacionadas