Визначте дату створення файлів у Java


102

Існує ще одне подібне питання до мого StackOverflow ( Як отримати дату створення файлу на Java ), але відповіді насправді немає, оскільки в ОП була інша потреба, яку можна було б вирішити за допомогою інших механізмів. Я намагаюся створити список файлів у каталозі, який можна сортувати за віком, звідси необхідність дати створення файлу.

Я не знайшов жодного хорошого способу це зробити після багатого перегляду веб-сторінок. Чи існує механізм отримання дати створення файлів?

BTW, який зараз знаходиться в системі Windows, може знадобитися і для роботи в системі Linux. Крім того, я не можу гарантувати, що дотримання файлу імен файлів буде дотримано там, де дата / час створення вкладені в ім'я.


2
Добре, після додаткових обговорень та досліджень файлових систем ми вирішили, що використання останньої модифікації достатньо, оскільки, ймовірно, доведеться перевіряти разом із датою створення. І те й інше потрібно перевірити, щоб визначити, чи був нещодавно змінений старий файл і тому все ще активний. Отже, просто перевірте, чи є файл, модифікований найдалі в минулому. Дякую за весь вклад. До речі, я б хотів використовувати nio, але аромат Linux тут не підтримує створення файлів.
Тодд

Відповіді:


163

У Java nio є варіанти доступу до createTime та інших метаданих, доки файлова система їх надає. Перевірити це посилання з

Наприклад (надається на основі коментаря @ ydaetskcoR):

Path file = ...;
BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class);

System.out.println("creationTime: " + attr.creationTime());
System.out.println("lastAccessTime: " + attr.lastAccessTime());
System.out.println("lastModifiedTime: " + attr.lastModifiedTime());

16
Це було б найкраще, але це Java 7. Ми все ще використовуємо 6, але я вивчу наші варіанти оновлення.
Тодд

1
Фантастичний. Саме мені це було потрібно.
RestInPeace

7
скористайтеся readAttributes(file.toPath(), BasicFileAttributes.class)іншим: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))
Хулі

1
@Hooli Не хвилюйся, друже! Спробуйте це logicbig.com/how-to/java/file-creation-date.html .
Сократ

1
Дата створення файлів недоступна в JDK 8 (принаймні), оскільки statxдодано syscall у новій версії ядра Linux.
Санкт-Антаріо

15

Я вирішив цю проблему за допомогою JDK 7 з цим кодом:

package FileCreationDate;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class Main
{
    public static void main(String[] args) {

        File file = new File("c:\\1.txt");
        Path filePath = file.toPath();

        BasicFileAttributes attributes = null;
        try
        {
            attributes =
                    Files.readAttributes(filePath, BasicFileAttributes.class);
        }
        catch (IOException exception)
        {
            System.out.println("Exception handled when trying to get file " +
                    "attributes: " + exception.getMessage());
        }
        long milliseconds = attributes.creationTime().to(TimeUnit.MILLISECONDS);
        if((milliseconds > Long.MIN_VALUE) && (milliseconds < Long.MAX_VALUE))
        {
            Date creationDate =
                    new Date(attributes.creationTime().to(TimeUnit.MILLISECONDS));

            System.out.println("File " + filePath.toString() + " created " +
                    creationDate.getDate() + "/" +
                    (creationDate.getMonth() + 1) + "/" +
                    (creationDate.getYear() + 1900));
        }
    }
}

13

Як продовження цього питання - оскільки воно стосується конкретно часу створення та обговорює його отримання за допомогою нових класів nio - здається, що зараз у реалізації JDK7 вам не пощастило. Додаток: така ж поведінка є у OpenJDK7.

У файлових системах Unix ви не можете отримати часову позначку створення, ви просто отримаєте копію останнього часу модифікації. Так сумно, але, на жаль, правда. Я не впевнений, чому це так, але код конкретно робить це, як буде показано нижче.

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.*;

public class TestFA {
  static void getAttributes(String pathStr) throws IOException {
    Path p = Paths.get(pathStr);
    BasicFileAttributes view
       = Files.getFileAttributeView(p, BasicFileAttributeView.class)
              .readAttributes();
    System.out.println(view.creationTime()+" is the same as "+view.lastModifiedTime());
  }
  public static void main(String[] args) throws IOException {
    for (String s : args) {
        getAttributes(s);
    }
  }
}

1
Чи знаєте ви, як це зробити для Android? BasicFileAttributes недоступний як вбудований там API ...
андроїд розробник

Це дійсно так, навіть заклик statне працює. Якщо ви не запустили ядро ​​вище 4,11 з glibc вище 2,28 і coreutils вище 8,31, тоді statви повідомлите про народження файлу. Дивіться відповідну відповідь unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/… В даний час JDK не використовує statx syscal.
Бріс

12

Це основний приклад того, як отримати дату створення файлу в Java, використовуючи BasicFileAttributesклас:

   Path path = Paths.get("C:\\Users\\jorgesys\\workspaceJava\\myfile.txt");
    BasicFileAttributes attr;
    try {
    attr = Files.readAttributes(path, BasicFileAttributes.class);
    System.out.println("Creation date: " + attr.creationTime());
    //System.out.println("Last access date: " + attr.lastAccessTime());
    //System.out.println("Last modified date: " + attr.lastModifiedTime());
    } catch (IOException e) {
    System.out.println("oops error! " + e.getMessage());
}

Люди, які бажають використовувати цей клас, повинні відзначити, що він розпочав доставку на Java 1.7.
jwj

9

API java.io.Fileлише підтримує отримання останнього зміненого часу. І Інтернет дуже спокійний на цю тему.

Якщо я не пропустив щось істотне, бібліотека Java як є (до, але ще не включає Java 7) не включає цю можливість. Отже, якщо ви відчайдушно ставились до цього, одним із рішень було б написати якийсь код C (++) для виклику системних процедур та виклику його за допомогою JNI. Здається, більшість цієї роботи вже зроблена для вас у бібліотеці під назвою JNA .

Для цього вам може знадобитися зробити невелике кодування для ОС на Java, оскільки ви, мабуть, не знайдете ті самі системні виклики, які доступні в Windows та Unix / Linux / BSD / OS X.


2
Так, Java 7 було б чудово, оскільки у nio, здається, це є в основних атрибутах. Ніколи не думав, що буду скаржитися на те, що я народився занадто рано! ;)
Тодд

6
Причина, що Fileклас не має цієї можливості, полягає в тому, що більшість файлових систем навіть не відстежують цю інформацію. І ті, що не завжди домовляються про те, коли його слід оновлювати.
Синтаксичний

@Syntactic: насправді більшість файлових систем відстежують цю інформацію . Винятки включають ext <= 3 та Reiser. FAT, NTFS, HFS, ZFS та ext4 підтримують його. Але повільно розповсюджуватися через усі шари Linux та бібліотеки та команди, щоб зробити його універсальним.
hippietrail

@Carl У Linux я отримую дату модифікації та створення як однакову під час використання Java NIO. Це нормальна поведінка?
Jayesh Dhandha

@JayeshDhandha, якщо після створення файлу нічого не змінює файл, я б очікував, що час створення та модифікації буде рівним. Ви можете спробувати змінити це за допомогою touchзмінити час моди та повторити перевірку.
Карл Смотрич

9

У системі Windows можна використовувати безкоштовну бібліотеку FileTimes .

Це буде простіше у майбутньому з Java NIO.2 (JDK 7) та пакетом java.nio.file.attribute .

Але пам’ятайте, що більшість файлових систем Linux не підтримують часові позначки створення файлів .


Будь-який інший шлях для машин Linux, який не підтримує створений час?
Маверик

Просто використовуйте файлову систему, яка підтримує часові позначки створення файлів. Пов’язана стаття у Вікіпедії передбачає, що ext4 є досить поширеним зараз.
дантом

1

in java1.7 + Ви можете використовувати цей код, щоб отримати час створення файлу!

private static LocalDateTime getCreateTime(File file) throws IOException {
        Path path = Paths.get(file.getPath());
        BasicFileAttributeView basicfile = Files.getFileAttributeView(path, BasicFileAttributeView.class, LinkOption.NOFOLLOW_LINKS);
        BasicFileAttributes attr = basicfile.readAttributes();
        long date = attr.creationTime().toMillis();
        Instant instant = Instant.ofEpochMilli(date);
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }

Ви можете, будь ласка, детальніше пояснити, для чого нам потрібна ця суєта Instant.ofEpochMilli(date). Дякую
Кирило Кармазін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.