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:
- Aloque os blocos necessários para conter os dados.
- Escreva zeros nesses blocos ou faça com que zeros sejam apresentados se você tentar lê-los.
- 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.