Há outra questão semelhante a minha no StackOverflow ( como obter a data de criação de um arquivo em Java ), mas a resposta não está realmente lá, pois o OP tinha uma necessidade diferente que poderia ser resolvida por meio de outros mecanismos. Estou tentando criar uma lista dos arquivos em um diretório que pode ser classificado por idade, daí a necessidade da data de criação do arquivo.
Não encontrei uma boa maneira de fazer isso depois de pesquisar muito na web. Existe um mecanismo para obter as datas de criação do arquivo?
BTW, atualmente em um sistema Windows, pode precisar disso para funcionar em um sistema Linux também. Além disso, não posso garantir que uma convenção de nomenclatura de arquivo seja seguida onde a data / hora de criação está embutida no nome.
fonte
Respostas:
Java nio tem opções para acessar o creationTime e outros metadados, desde que o sistema de arquivos os forneça. Confira neste link para fora
Por exemplo (fornecido com base no comentário de @ ydaetskcoR):
fonte
readAttributes(file.toPath(), BasicFileAttributes.class)
outra coisa que você obtém:no suitable method found for readAttributes(File,Class<BasicFileAttributes>) method Files.<A>readAttributes(Path,Class<A>,LinkOption...) is not applicable (cannot infer type-variable(s) A (argument mismatch; File cannot be converted to Path))
statx
syscall foi adicionado na versão mais recente do kernel Linux.Resolvi esse problema usando o JDK 7 com este código:
fonte
Seguindo essa questão - uma vez que se relaciona especificamente ao tempo de criação e discute como obtê-lo por meio das novas classes nio - parece que agora na implementação do JDK7 você está sem sorte. Adendo: o mesmo comportamento é no OpenJDK7.
Em sistemas de arquivos Unix, você não pode recuperar o carimbo de data e hora da criação, simplesmente obtém uma cópia da hora da última modificação. Tão triste, mas infelizmente é verdade. Não sei por que isso acontece, mas o código faz isso especificamente, conforme demonstrará a seguir.
fonte
stat
não funciona. A menos que você execute um kernel superior a 4.11 com glibc superior a 2.28 e coreutils superior a 8.31, entãostat
irá relatar o nascimento do arquivo. Veja a resposta relacionada unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/… Atualmente o JDK não usa statx syscal.Este é um exemplo básico de como obter a data de criação de um arquivo
Java
, usando aBasicFileAttributes
classe:fonte
A API de
java.io.File
suporta apenas a última modificação hora . E a Internet também não fala muito sobre esse assunto.A menos que eu tenha perdido algo significativo, a biblioteca Java como está (até mas ainda não incluindo o Java 7) não inclui esse recurso. Portanto, se você estivesse desesperado por isso, uma solução seria escrever algum código C (++) para chamar as rotinas do sistema e chamá-lo usando JNI. A maior parte deste trabalho parece já ter sido feita para você em uma biblioteca chamada JNA , no entanto.
Você ainda pode precisar fazer uma pequena codificação específica do sistema operacional em Java para isso, pois provavelmente não encontrará as mesmas chamadas de sistema disponíveis no Windows e Unix / Linux / BSD / OS X.
fonte
File
classe não tem esse recurso é que a maioria dos sistemas de arquivos nem mesmo rastreia essas informações. E aqueles que concordam nem sempre concordam quando deve ser atualizado.touch
para mudar o tempo do mod e depois verificar novamente.Em um sistema Windows, você pode usar FileTimes grátis biblioteca .
Isso será mais fácil no futuro com Java NIO.2 (JDK 7) e o pacote java.nio.file.attribute .
Mas lembre-se de que a maioria dos sistemas de arquivos Linux não oferece suporte a carimbos de data / hora de criação de arquivo .
fonte
em java1.7 + Você pode usar este código para obter o tempo de criação do arquivo!
fonte
Instant.ofEpochMilli(date)
. Obrigado