File.WriteAllText não liberando dados no disco

Eu já tive 3 relatórios de máquinas do usuário travando enquanto utilizava meu software .. as falhas não estão relacionadas ao meu programa, mas quando elas reiniciam os arquivos de configuração, minhas gravações de programas estão corrompidas.

Não há nada de especial em como os arquivos estão sendo gravados, simplesmente criando uma representação Json e despejando-a em disco usando File.WriteAllText ()

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

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

Um usuário me enviou um dos arquivos e o comprimento parece certo (~ 3kb), mas o conteúdo é todo 0x00.

De acordo com a postagem abaixo, File.WriteAllText deve fechar o identificador do arquivo, liberando qualquer conteúdo não gravado no disco:

No meu código C #, o computador espera até que a saída seja concluída antes de prosseguir?

MAS, como apontado por Alberto nos comentários:

System.IO.File.WriteAllText quando concluído, liberará todo o texto no cache do sistema de arquivos e, em seguida, ele será gravado preguiçosamente na unidade.

Portanto, presumo que o que está acontecendo aqui é que o arquivo está sendo limpo e inicializado com 0x00, mas os dados ainda não foram gravados quando o sistema trava.

Eu estava pensando em talvez usar algum tipo de arquivo temporário para que o processo seria assim:

Gravar novos conteúdos no arquivo temporárioExcluir arquivo originalRenomear arquivo temporário para original

Eu não acho que isso resolverá o problema, pois presumo que o Windows apenas moverá o arquivo, embora o pedido de veiculação ainda esteja pendente.

Existe alguma maneira de forçar a máquina a despejar esses dados em disco, em vez de decidir quando fazê-lo ou talvez uma maneira melhor de atualizar um arquivo?

ATUALIZAR:

Com base nas sugestões de @usr, @mikez e @llya luzyanin, criei uma nova função WriteAllText que executa a gravação usando a seguinte lógica:

Crie um arquivo temporário com o novo conteúdo usando o sinalizador FileOptions.WriteThroughGrava os dados no disco (não retornará até que a gravação seja concluída)File.Replace para copiar o conteúdo do novo arquivo temporário para o arquivo real, fazendo um backup

Com essa lógica, se o arquivo final falhar ao carregar, meu código verifica um arquivo de backup e carrega-o

Aqui está o 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);
}

questionAnswers(1)

yourAnswerToTheQuestion