Sistema de arquivos do Windows 7: Espantado - Exclua e recrie o arquivo: o tempo de criação não muda! Por que e como consertar?

Sistema de arquivos do Windows 7: Espantado - Exclua e recrie o arquivo: o tempo de criação não muda! Por que e como consertar?

preciso atualizar ohora de criaçãode um arquivo falso para 'agora', excluindo-o e recriando-o. Estranhamente, o arquivo recém-criado parece herdar a hora de criação do arquivo original!

Deixe-me demonstrar:

> touch a.txt       //create a new file
> dir /T:C          //creation time
02/27/2013  02:04 PM                 0 a.txt

> dir /T:W          //modification time
02/27/2013  02:04 PM                 0 a.txt

//wait a bit...
> touch a.txt       //update modified-time
> dir /T:C
02/27/2013  02:04 PM                 0 a.txt

> dir /T:W          //mod-time changed, as expected
02/27/2013  02:05 PM                 0 a.txt

> del a.txt
> touch a.txt       //recreate file
> dir /T:C          //same original ctime !!
02/27/2013  02:04 PM                 0 a.txt

> dir /T:W          //the actual time the 2nd file was created
02/27/2013  02:06 PM                 0 a.txt

> del a.txt
> touch b.txt       //ok, create a file with a different name
> dir /T:C          //ctime as expected
02/27/2013  02:07 PM                 0 b.txt

> mv b.txt a.txt
> dir /T:C          //again, ctime of original file!
02/27/2013  02:04 PM                 0 a.txt

> del a.txt
> touch c.txt       //create a file with a different name, again
> dir /T:C          //ctime as expected
02/27/2013  02:08 PM                 0 c.txt

> cp c.txt a.txt    //this time copy it...
> dir /T:C          //ctime of a.txt is that of original file!
02/27/2013  02:04 PM                 0 a.txt
02/27/2013  02:08 PM                 0 c.txt

//wait longer...

> del *
> touch d.txt
> dir /T:C
02/27/2013  02:22 PM                 0 d.txt

> cp d.txt a.txt
> dir /T:C          //lo and behold, the ctime has changed.
02/27/2013  02:22 PM                 0 a.txt
02/27/2013  02:22 PM                 0 d.txt

Isso conclui minha demonstração. Surgem duas questões:

O que é?!

  1. ^^^ O que ele disse.

  2. Como posso consertar isso?

Ok, deixe-me expandir isso:

  1. Alguém sabe qual mecânica interna do sistema operacional Windows/NTFS está em jogo? Parece que ocorre algum cache de metadados de arquivo e a invalidação do cache tem um limite de tempo.

  2. Alguma sugestão sobre como posso obter um arquivo novo com o mesmo nome do original, com um arquivo atualizado ctime? Qualquer sugestão é bem-vinda, sejam eles scripts em lote, hacks de registro, programáticos ou o que você quiser.

Responder1

As respostas:

  1. O processo é chamado de 'File System Tunneling' (derivado da mecânica quântica) e, pelo que entendi, foi originalmente projetado para win 95. É necessário que o sistema operacional lide com a situação quando um programa apenas salva e sobrescreve um arquivo . Nesse caso, o usuário geralmente espera que a data de criação (e o nome curto do arquivo) não mude, mas sem o tunelamento, a data de criação refletiria o último horário de salvamento. Ver:Alguns lembretes sobre os tempos dos arquivos do Windows,A história apócrifa do tunelamento do sistema de arquivos
  2. Existem duas maneiras de resolver o problema:
  • por modificação imediata do tempo de criação após salvar/criar
  • pelas configurações do registro (para todo o sistema operacional):

As configurações de tunelamento de arquivos são controladas pela chave do Registro do Windows HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem.

Para aumentar o tempo de cache de tunelamento, modifique/adicione o valor DWORD MaximumTunnelEntryAgeInSeconds. O tempo de cache padrão é de 15 segundos. Para desabilitar o tunelamento, modifique/adicione o valor DWORD MaximumTunnelEntries e defina-o como 0.

Responder2

Não uso o Windows, mas acho que encontrei uma solução alternativa.

  1. Win32 aparentemente permitemodificando tempos de criação de arquivos, usando oDefinirFileTimefunção.

  2. Se você não estiver escrevendo um aplicativo com Win32, poderá usar o PowerShell. Baseado em umresposta stackoverflow semelhante:

    C:\> powershell  (ls your-file-name-here).CreationTime = Get-Date
    

Responder3

Use atime, não ctime. O tempo de acesso é efetivamente o tempo de criação, pois não é atualizado no acessonão mais

informação relacionada