Corrupção de dados em arquivos binários devido ao desligamento forçado do computador

Corrupção de dados em arquivos binários devido ao desligamento forçado do computador

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

É possível que o desligamento repentino do computador tenha corrompido os dados dos meus arquivos? Ou será que isso não pode acontecer porque os dados, uma vez gravados e salvos no disco, não são corrompidos, mesmo no caso de desligamento repentino? Se for o último caso, terei que iniciar uma investigação detalhada do problema, mas realmente não suspeito que algo mais possa ter dado errado. O programa é muito simples e está em uso há 2 anos, e esta é a primeira vez que vejo corrupção de dados de arquivos gravados com o programa.

PS O arquivo realmente foi salvo. O programa que salvou o arquivo gerencia a E/S do arquivo corretamente - ele fecha o arquivo após terminar de gravá-lo. Além disso, o programa nem estava em execução quando ocorreu o desligamento. Isso aconteceu no Windows 8.1.

Responder1

Simplificando, 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 zeros sejam apresentados se você tentar lê-los.
  3. Escreva seus dados nos blocos alocados.

A etapa 2 é um requisito devido à segurança do sistema. Os blocos alocados podem ter contido anteriormente dados de outra pessoa e seria uma violação de segurança para o sistema permitir a leitura de dados antigos. Então você obtém zeros. Se a energia fosse cortada entre as etapas 2 e 3, você veria zeros em vez dos seus dados.

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

Em sistemas compatíveis com POSIX, liguefsync()para garantir que seus dados tenham alcançado o armazenamento permanente.

informação relacionada