File.WriteAllText no descarga datos al disco

He tenido 3 informes ahora de que las máquinas de los usuarios se bloquean mientras uso mi software ... los bloqueos no están relacionados con mi programa, pero cuando reinician los archivos de configuración, mis programas escritos están todos corruptos.

No hay nada especial en cómo se escriben los archivos, simplemente creando una representación Json y volviéndola al disco usando File.WriteAllText ()

// save our contents to the disk
string json = JsonConvert.SerializeObject(objectInfo, Formatting.Indented);

// write the contents
File.WriteAllText(path, json);

Un usuario me envió uno de los archivos y la longitud parece correcta (~ 3kb) pero el contenido es 0x00.

De acuerdo con la publicación a continuación, File.WriteAllText debería cerrar el identificador del archivo, vaciando cualquier contenido no escrito en el disco:

En mi código C #, ¿espera la computadora hasta que se complete la salida antes de continuar?

PERO, como señaló Alberto en los comentarios:

System.IO.File.WriteAllText cuando se complete, vaciará todo el texto a la caché del sistema de archivos, luego, se escribirá perezosamente en la unidad.

Así que supongo que lo que está sucediendo aquí es que el archivo se está borrando e inicializando con 0x00, pero los datos aún no se escriben cuando el sistema falla.

Estaba pensando en usar algún tipo de archivo temporal para que el proceso fuera así:

Escribir nuevos contenidos en el archivo temporalEliminar archivo originalCambiar el nombre del archivo temporal a original

No creo que eso resuelva el problema, ya que supongo que Windows solo moverá el archivo a pesar de que el IO aún está pendiente.

¿Hay alguna forma de forzar a la máquina a volcar esos datos en el disco en lugar de decidir cuándo hacerlo o quizás una mejor manera de actualizar un archivo?

ACTUALIZAR:

Basado en sugerencias de @usr, @mikez y @llya luzyanin, he creado una nueva función WriteAllText que realiza la escritura usando la siguiente lógica:

Cree un archivo temporal con los nuevos contenidos utilizando el indicador FileOptions.WriteThroughEscribe los datos en el disco (no volverá hasta que la escritura se haya completado)File.Replace para copiar el contenido del nuevo archivo temporal al archivo real, haciendo una copia de seguridad

Con esa lógica, si el archivo final no se carga, mi código comprueba un archivo de respaldo y lo carga en su lugar

Aquí está el código:

public static void WriteAllTextWithBackup(string path, string contents)
{
    // generate a temp filename
    var tempPath = Path.GetTempFileName();

    // create the backup name
    var backup = path + ".backup";

    // delete any existing backups
    if (File.Exists(backup))
        File.Delete(backup);

    // get the bytes
    var data = Encoding.UTF8.GetBytes(contents);

    // write the data to a temp file
    using (var tempFile = File.Create(tempPath, 4096, FileOptions.WriteThrough))
        tempFile.Write(data, 0, data.Length);

    // replace the contents
    File.Replace(tempPath, path, backup);
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta