Data Corruption em arquivos binários do encerramento forçado do computador

2

Eu salvei alguns dados em um arquivo binário usando C ++. Dois minutos depois que os dados foram salvos, a energia do computador foi subitamente interrompida. Quando reiniciei o computador, os dados estavam corrompidos. Quando eu li o arquivo binário, todos os valores eram 0 , o que certamente não é o que eu escrevi no arquivo.

É possível que o desligamento repentino do computador tenha corrompido os dados em meus arquivos? Ou é assim que este não pode ser o caso porque os dados, uma vez gravados e salvos no disco, não corrompem, mesmo no caso de queda repentina de energia? Se for o último, então terei que iniciar uma investigação detalhada do problema, mas realmente não suspeito que qualquer outra coisa possa ter dado errado. O programa é muito simples e está em uso há 2 anos, e esta é a primeira vez que vejo qualquer corrupção de dados de arquivos escritos usando o programa.

P.S. O arquivo tinha realmente terminado de salvar. O programa que salvou o arquivo gerencia o arquivo I / O corretamente - ele fecha o arquivo após terminar de escrevê-lo. Além disso, o programa não estava funcionando quando a queda de energia aconteceu. Isso aconteceu no Windows 8.1.

    
por The Vivandiere 14.09.2015 / 17:21

1 resposta

2

Simplificado, quando você cria um arquivo de dados, o sistema operacional deve fazer estas três coisas:

  1. Aloque os blocos necessários para conter os dados.
  2. Escreva zeros nesses blocos ou faça com que os zeros sejam apresentados se você tentar lê-los.
  3. Escreva seus dados para os blocos alocados.

O passo 2 é um requisito devido à segurança do sistema. Os blocos alocados podem ter contido anteriormente os dados de outra pessoa e seria uma violação de segurança para o sistema permitir que você leia seus dados antigos. Então você ganha zeros. Se a energia for cortada entre as etapas 2 e 3, você verá zeros em vez de seus dados.

Dependendo do sistema operacional e do sistema de arquivos subjacentes, a menos que você sincronize explicitamente seus dados com o disco em seu programa, a etapa 3 poderá ocorrer um tempo arbitrariamente longo após a etapa 2.

Em sistemas compatíveis com POSIX, chame fsync () para garantir que seus dados tenham atingido o armazenamento permanente .

    
por 14.09.2015 / 17:53