Criar um arquivo TXT ou INI corrompido?

0

Ocasionalmente, recebemos relatórios de arquivos corrompidos dos clientes. Estes são raros e quase impossíveis de reproduzir. Quando entramos na máquina dos clientes remotamente, descobrimos que o arquivo (geralmente um arquivo INI) não pode ser aberto. O arquivo também não pode ser copiado localmente para análise. Com base em exemplos limitados, esses arquivos corrompidos têm um tamanho de "0kB" e só podem ser excluídos. Quando isso ocorre, parece afetar apenas um arquivo INI entre dezenas. O resto do sistema está bem. Depois que o arquivo corrompido é recriado, o sistema se recupera completamente.

Não sabemos como isso acontece e gostaríamos de reproduzir e, esperamos, resolver o problema. Pode ser um problema do Windows, um erro de codificação e até mesmo um problema de hardware relacionado ao desligamento inesperado da máquina. Para fins de teste, criei um arquivo TXT com lixo aleatório, como em:

// Delphi code, but applies to any language
procedure TfrmDiagnostics.CreateCorruptFile();
var
    fpDump: TextFile;
    nChar: Integer;
begin
    RandSeed := (GetTickCount() mod 23);
    AssignFile(fpDump, 'C:\Corrupted.txt');
    for nChar:=1 to 100 do
        Write(fpDump, Chr(Random(250)));

    Flush(fpDump);
    CloseFile(fpDump);
end;

Isso gera um arquivo bem confundido, os primeiros bytes foram: NREAA # »BÁLÁb… ilL ('- ØD YL & d .... Mas o arquivo ainda é aberto no Notepad ++ e em alguns outros editores ASCII que tentei.

É possível criar um arquivo genuinamente "corrompido" no Windows, que o Windows se recusa a abrir? Isso possivelmente envolve mexer com a tabela de alocação de arquivos, mas duvido que os usuários tenham acesso ao FAT (e não parece uma coisa segura a se fazer).

AlainD
fonte

Respostas:

0

A razão pela qual um arquivo não pode ser aberto não é porque o arquivo está corrompido, mas porque há um bloqueio de gravação no arquivo.

Isso significa que a conexão de rede foi cortada quando o arquivo foi aberto e o servidor está mantendo o bloqueio ativo.

Se você abrir Computer Managementno servidor e desdobrar para abrir arquivos, deverá encontrar referências a esses arquivos .ini, com a capacidade de remover a trava, após o qual poderá fazer qualquer coisa com o arquivo novamente.

Para recriar essa circunstância, crie um arquivo ou abra um arquivo existente. Escreva no arquivo. Enquanto isso, desconecte seu PC da rede e reconecte-o. O arquivo estará corrompido e não poderá ser aberto da mesma maneira que você experimentou anteriormente.

Agora, descubra o motivo pelo qual a rede se desconecta. Por exemplo, ao trabalhar com diretivas de grupo, observe que as diretivas de grupo são atualizadas a cada 90 minutos. Se você definir o compartilhamento para substituir, ele será excluído e recriado a cada 90 minutos, com alguns minutos de intervalo aleatório. Se você estiver gravando em um arquivo nesse momento, o arquivo poderá ficar corrompido.

LPChip
fonte
2
Vale ressaltar que essa será a própria definição de insanidade se você tentar cobrir todas as maneiras pelas quais um arquivo está inacessível ou corrompido. Portanto, é muito mais fácil (e sem dúvida melhor) lidar com exceções que, por meio de uma notificação, informa ao usuário que o arquivo .ini foi recriado. Se você não está falando sobre o arquivo .ini do aplicativo de sua empresa, então isso é mais complicado, mas também vai ser impossível cobrir toda a razão possível uma ini não pode ser processado
Ramhound
Um bloqueio de gravação também não impediria a exclusão do arquivo?
Twisty Imitador de
Existe alguma maneira com algum código hackeado (qualquer idioma) de criar um arquivo localmente (ou seja, não através da rede) com um bloqueio de gravação ainda ativo para tentar reproduzir isso?
precisa saber é o seguinte
@ Twisty: Está correto. O arquivo não pôde ser aberto pelo Windows, mas pôde ser excluído.
precisa saber é o seguinte
11
@ Ramhound: Comentário justo, vou ver o que posso fazer para alterar o código "verificar este arquivo". O problema com esse tipo de problema é que o problema é tão raro que você nunca tem certeza de ter resolvido o bug, a menos que possa reproduzir o problema antes e depois!
AlainD