Se um arquivo for reescrito com o mesmo conteúdo, a hora da modificação será alterada?

1

Eu tenho um arquivo que é escrito periodicamente por um programa Java.
Se for reescrito exatamente com o mesmo conteúdo, a hora da modificação do arquivo será alterada?
Parece que isso não acontece; o que me surpreendeu - eu não diria nada está verificando o conteúdo antigo contra o novo conteúdo.

Opa, percebi que, se o conteúdo não foi alterado, o programa Java não está gravando o arquivo. Minha culpa. Mas é bom ter uma resposta definitiva.

    
por cmgharris 18.07.2017 / 12:03

3 respostas

1

Sim, o horário da modificação será alterado. Você pode ver isso sozinho:

echo Hello > test
stat test
sleep 2
echo Hello > test
stat test

O segundo stat mostrará o mesmo tempo de acesso que o primeiro (o que prova que o arquivo não foi excluído e recriado - o que obviamente corresponde ao comportamento necessário para > ), mas modificado e alterado vezes.

Isso é especificado por POSIX, por exemplo em write() :

Upon successful completion, where nbyte is greater than 0, write() shall mark for update the last data modification and last file status change timestamps of the file, and if the file is a regular file, the S_ISUID and S_ISGID bits of the file mode may be cleared.

    
por 18.07.2017 / 12:09
0

Toda vez que o arquivo é salvo, sua hora de modificação é alterada. Se você está salvando o arquivo depois de fazer alterações ou apenas salvando o arquivo sem fazer nenhuma alteração, a hora da modificação muda.

Se a hora não estiver mudando, provavelmente o arquivo não está sendo salvo. Enquanto você está reescrevendo o mesmo conteúdo novamente, tente verificar se o arquivo está sendo salvo depois que o conteúdo for reescrito.

    
por 18.07.2017 / 12:14
0

NOTA: Esta não é uma resposta direta à sua pergunta, ao contrário, é uma resposta à óbvia pergunta de acompanhamento " Como eu detecto se um arquivo realmente mudou se não posso confiar no timestamp? "

Se você precisar verificar se o conteúdo de um arquivo (e não apenas seu registro de data e hora) foi alterado, será necessário comparar o conteúdo atual com o conteúdo anterior. Por exemplo, em sh :

Executando uma comparação byte a byte com cmp :

if [ -e "$oldcopy" ] && cmp -s "$oldcopy" "$currentcopy" ; then
  # do whatever needs doing if the file hasn't changed
else
  # first do whatever needs doing if the file is new or has changed
  # then make a copy of the current file
  cp -af "$currentcopy" "$oldcopy"
fi

Usando checksums aka hashes aka message digests com md5sum :

if [ -e "$filename.md5sum" ] && md5sum --status "$filename.md5sum)" ; then
  # do whatever needs doing if the file hasn't changed
else
  # first do whatever needs doing if the file is new or has changed
  # then save an md5sum of the current file
  md5sum "$filename" > "$filename.md5sum"
fi

md5sum usa mais energia da CPU para gerar o resumo da mensagem para o arquivo. cmp usa mais espaço em disco para fazer uma segunda cópia completa do arquivo.

Qualquer outra ferramenta de digestão (por exemplo, sha512 ) pode ser usada em vez de md5sum , se necessário ... e provavelmente deve ser se houver alguma implicação de segurança se os arquivos forem diferentes.

O Java, como muitos outros idiomas, possui bibliotecas para realizar cálculos de resumo de mensagens.

    
por 19.07.2017 / 04:01