Obter o tempo de criação do arquivo em milissegundos


13

Existe uma maneira de obter o tempo de criação de um arquivo no Windows com maior precisão? Quero obter o tempo de criação de um vídeo mp4 em milissegundos. Isso é possível?


Eu tenho que perguntar por que você precisa dessa precisão?
Moab

1
Gravo alguns dados do sensor em um dispositivo Android juntamente com um vídeo. Escrevi o registro do sensor sozinho e registrei a hora do sistema junto com cada valor do sensor. Para gravar o vídeo, uso a atividade padrão da câmera. Depois de enviar os dados para um PC, quero analisá-los. Para mesclar o vídeo com os dados do sensor, preciso saber quando o vídeo começou. Os segundos são um pouco grosseiros, então estou procurando uma maneira de obter uma hora de início mais exata do vídeo.
7269 Phil

3
Nota: se você precisar desse tipo de relacionamento entre dois fluxos de dados, geralmente é essencial colocar um sinal de registro no fluxo (como as velhas tábuas usadas nos filmes, como o diretor chama de "ação" .O aplauso era uma sugestão visual e áudio sugestão, permitindo que os dois ou mais fluxos sejam sincronizados posteriormente). Em algumas situações, o tempo decorrido entre a criação do arquivo no modo kernel (e a gravação do registro de data e hora) e a ativação do processo para que ele saiba que possui um identificador de arquivo a ser usado pode na verdade ser maior do que as tolerâncias que você tem para seus dados.
Cort Ammon - Restabelece Monica

Ao copiar suas coisas do Android para outro lugar, verifique se todas as ferramentas de cópia preservam a precisão do registro de data e hora. Observe que muitas ferramentas de cópia farão com que ctimea cópia seja a hora em que foi copiada.
Peter Cordes

1
No Windows, eu usaria o cygwin / mingw statpara obter todos os três registros de data e hora. Claro, é porque eu normalmente uso o GNU / Linux.
Peter Cordes

Respostas:


23

Resolução de carimbo de data e hora

O registro de data e hora de criação de um arquivo no Windows depende do sistema de arquivos:

  • FAT / VFAT tem uma resolução máxima de 2s

  • NTFS tem uma resolução máxima de 100 ns


solução wmic

Você pode usar wmicpara recuperar a data de criação do arquivo no microssegundo mais próximo.

Exemplo:

F:\test>wmic datafile where name="f:\\test\\test.txt" get creationdate | findstr /brc:[0-9]
20150329221650.080654+060

A data de criação 20150329221650.080654+060é um registro de data e hora, com o seguinte formato:

yyyymmddHHMMSS.xxxxxxsUUU

Onde:

  • yyyy Ano de quatro dígitos (0000 a 9999).

  • mm Mês de dois dígitos (01 a 12).

  • dd Dia do mês com dois dígitos (01 a 31).

  • HH Hora do dia com dois dígitos usando o relógio de 24 horas (00 a 23).

  • MM Minuto de dois dígitos na hora (00 a 59).

  • SS Número de dois dígitos de segundos no minuto (00 a 59).

  • xxxxxx Número de seis dígitos de microssegundos no segundo (000000 a 999999)

  • sSinal de mais ( +) ou sinal de menos ( -) para indicar um deslocamento positivo ou negativo do Tempo Universal Coordenado (UTC).

  • UUU Deslocamento de três dígitos indicando o número de minutos que o fuso horário de origem se desvia do UTC.


solução stat

Você também pode usar stat(de uma instalação cygwin ou mingw ).

Exemplo:

DavidPostill@Hal /f/test
$ stat test.txt | grep Birth
 Birth: 2015-03-29 22:16:50.080654200 +0100

saída dir para comparação

F:\test>dir /t:c test.txt
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

29/03/2015  22:16                32 test.txt
               1 File(s)             32 bytes
               0 Dir(s)  1,798,546,849,792 bytes free

Leitura adicional


@NateEldredge Obrigado, bem localizado. Resposta corrigida.
DavidPostill

4
Uma nota de cautela: apenas porque um registro de data e hora contém um dígito de alta frequência, como o dígito dos 100 nanossegundos, não significa que o relógio possa ser usado como uma fonte de tempo confiável na faixa de 100ns. Apenas afirma que há muitos bits de conteúdo que é [esperançosamente] monotônicos e aproximadamente relacionados ao tempo "real".
Cort Ammon - Restabelecer Monica

1
Consulte msdn CIM_DATETIME : na sua notação, xxxxxxé o número de seis dígitos de microssegundos no segundo (000000 a 999999) . Micro- , ie 10^-6. Obviamente, o primeiro trigêmeo representa mili- ( 10^-3): truncado, não arredondado. O segundo trigêmeo extraído não representa nada em si ... No entanto, alguns wmivalores de data e hora mostram o segundo trigêmeo 000sempre, por exemplo:wmic OS get LocalDateTime
JosefZ 07/07

1
Obrigado, este tipo de respostas é por isso que eu amo troca pilha :)
Phil

1
@MarisB. Ah Resposta atualizada.
DavidPostill

1

Uma maneira inteligente é demonstrada aqui: /programming/5180592/showing-ntfs-timestamp-with-100-nsec-granularity

Ele está usando o VBScript para consultar o banco de dados CIM do WMI e retornar a FILETIMEestrutura associada a um arquivo.

Também existem ferramentas de código aberto que podem inspecionar os metadados de um arquivo de mídia, como o EXIFtool, voltado para o gerenciamento de metadados da mídia criada por câmeras digitais.


1

Eu encontrei uma maneira de obter isso no Matlab:

Você pode usar a função GetFileTime escrita por Jan Simon. Se você não deseja compilar seus próprios arquivos mex, também pode fazer o download dos arquivos compilados aqui .

Não é tão exato quanto usar wmic (apenas ms), mas para o meu propósito é adequado.


-3

Ele depende do sistema de arquivos : FAT tem 2 segunda resolução, NTFS teoricamente tem 100 resolução ns, mas o real resolução é de 10 ms . Dito isso, as interrupções têm prioridade mais alta que a E / S do disco e não tenho certeza de que o efeito do cache de gravação tenha o carimbo de data / hora. Os temporizadores multimídia são otimizados para precisão, portanto, seria a maneira preferida de implementar o tempo.

Você pode usar uma ferramenta existente, como o XYplorer, para exibir registros de data e hora de alta resolução ou XYplorer mostrando ms, se preferir, criar seu próprio aplicativo. Use o método File.GetCreationTime ; ele retorna uma estrutura DateTime com propriedade Millisecond .


1
hum ... para não ser rude, mas você leu a resposta de @PostPostill?
td512 07/07/2015

2
"NTFS teoricamente tem resolução de 100 ns, mas a resolução real é de 10 ms " está incorreto - esse link realmente diz " no NT FAT , o tempo de criação tem uma resolução de 10 milissegundos". Isso não significa que o NTFS tenha essa resolução. Você pode ver na minha resposta que no NTFS wmicmostra uma resolução para o microssegundo mais próximo .
DavidPostill

Há uma diferença entre a resolução teórica e a máxima, uma indica bem a resolução máxima e a outra indica mais uma resolução média.
Ramhound 07/07

1
@DavidPostill Se o relógio apenas aumentar o tempo a cada 10ms, ter uma data e hora arquivada que possa representar 100ns ainda terá uma precisão de apenas 10ms. As APIs UtcNow típicas (em oposição aos contadores de alto desempenho projetados para medir diferenças de tempo ) aumentam o tempo a cada 0,5-16 ms no Windows, portanto, essa resposta é bastante plausível.
CodesInChaos

@CodesInChaos Sim, mas - "O melhor recurso para recuperar a hora do sistema é a API GetSystemTimeAsFileTime. É uma API de acesso rápido capaz de manter valores suficientemente precisos (unidades de 100 ns) em seus argumentos." - Não tenho acesso ao código-fonte do Windows, portanto não sei quais chamadas são usadas ao manipular os carimbos de data / hora do arquivo. Não sabemos qual é a resolução real - isso é apenas suposição.
DavidPostill
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.