Jest jeszcze jedno podobne pytanie do mojego w StackOverflow ( Jak uzyskać datę utworzenia pliku w Javie ), ale odpowiedzi nie ma, ponieważ OP miał inną potrzebę, którą można rozwiązać za pomocą innych mechanizmów. Próbuję stworzyć listę plików w katalogu, które można sortować według wieku, stąd potrzeba daty utworzenia pliku.
Nie znalazłem żadnego dobrego sposobu, aby to zrobić po wielu przeglądach sieci. Czy istnieje mechanizm pobierania dat utworzenia pliku?
BTW, obecnie w systemie Windows, może potrzebować tego do pracy również w systemie Linux. Nie mogę również zagwarantować, że będzie przestrzegana konwencja nazewnictwa plików, gdy data / godzina utworzenia jest osadzona w nazwie.
java
date
filesystems
Todd
źródło
źródło
Odpowiedzi:
Java nio ma opcje dostępu do czasu utworzenia i innych metadanych, o ile zapewnia je system plików. Sprawdzić ten link na zewnątrz
Na przykład (dostarczone na podstawie komentarza @ ydaetskcoR):
źródło
readAttributes(file.toPath(), BasicFileAttributes.class)
innego dostaniesz: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 został dodany w nowszej wersji jądra Linuksa.Rozwiązałem ten problem używając JDK 7 z tym kodem:
źródło
W ramach kontynuacji tego pytania - ponieważ odnosi się ono konkretnie do czasu tworzenia i omawia uzyskanie go za pośrednictwem nowych klas nio - wydaje się, że teraz w implementacji JDK7 nie masz szczęścia. Dodatek: to samo zachowanie jest w OpenJDK7.
Na systemach plików Unix nie możesz pobrać znacznika czasu utworzenia, po prostu dostajesz kopię czasu ostatniej modyfikacji. Tak smutne, ale niestety prawdziwe. Nie jestem pewien, dlaczego tak jest, ale kod specjalnie to robi, co pokaże poniżej.
źródło
stat
nie działa. O ile nie uruchomisz jądra w wersji wyższej niż 4.11 z glibc wyższym niż 2.28 i coreutils w wersji wyższej niż 8.31, wtedystat
zgłosi narodziny pliku. Zobacz powiązaną odpowiedź unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/… Obecnie JDK nie używa statx syscal.Oto podstawowy przykład, jak uzyskać datę utworzenia pliku
Java
za pomocąBasicFileAttributes
class:źródło
API
java.io.File
obsługuje tylko pobieranie czasu ostatniej modyfikacji . Internet jest też bardzo cichy na ten temat.O ile nie przeoczyłem czegoś ważnego, biblioteka Java taka, jaka jest (do Javy 7, ale jeszcze jej nie obejmuje) nie obejmuje tej możliwości. Więc gdybyś był zdesperowany, jednym z rozwiązań byłoby napisanie kodu w C (++) do wywoływania procedur systemowych i wywoływanie go przy użyciu JNI. Wydaje się jednak, że większość tej pracy została już wykonana dla Ciebie w bibliotece o nazwie JNA .
Być może nadal będziesz musiał wykonać trochę kodowania specyficznego dla systemu operacyjnego w Javie, ponieważ prawdopodobnie nie znajdziesz tych samych wywołań systemowych dostępnych w Windows i Unix / Linux / BSD / OS X.
źródło
File
klasa nie ma tej możliwości, jest to, że większość systemów plików nawet nie śledzi tych informacji. A ci, którzy się zgadzają, nie zawsze są zgodni co do tego, kiedy należy go zaktualizować.touch
do zmiany czasu modyfikacji, a następnie sprawdzając ponownie.W systemie Windows możesz skorzystać z bezpłatnej biblioteki FileTimes .
W przyszłości będzie to łatwiejsze dzięki Java NIO.2 (JDK 7) i pakietowi java.nio.file.attribute .
Pamiętaj jednak, że większość systemów plików Linuksa nie obsługuje znaczników czasu tworzenia plików .
źródło
w java1.7 + Możesz użyć tego kodu, aby uzyskać czas utworzenia pliku!
źródło
Instant.ofEpochMilli(date)
. Dzięki