Tentukan tanggal pembuatan file di Java

102

Ada pertanyaan serupa lainnya untuk saya di StackOverflow ( Bagaimana cara mendapatkan tanggal pembuatan file di Java ), tetapi jawabannya tidak benar-benar ada karena OP memiliki kebutuhan berbeda yang dapat diselesaikan melalui mekanisme lain. Saya mencoba membuat daftar file dalam direktori yang dapat diurutkan berdasarkan usia, oleh karena itu diperlukan tanggal pembuatan file.

Saya belum menemukan cara yang baik untuk melakukan ini setelah banyak penjelajahan web. Apakah ada mekanisme untuk mendapatkan tanggal pembuatan file?

BTW, saat ini menggunakan sistem Windows, mungkin membutuhkan ini untuk bekerja pada sistem Linux juga. Selain itu, saya tidak dapat menjamin bahwa konvensi penamaan file akan diikuti di mana tanggal / waktu pembuatan disematkan dalam nama.

Todd
sumber
2
Oke, setelah lebih banyak diskusi dan investigasi ke dalam sistem file, kami telah memutuskan bahwa menggunakan modifikasi terakhir sudah cukup karena kemungkinan besar harus diperiksa bersama dengan tanggal pembuatan. Keduanya perlu diperiksa untuk menentukan apakah file lama baru saja diubah dan karena itu masih aktif. Jadi, periksa saja file yang dimodifikasi paling jauh di masa lalu. Terima kasih atas semua masukannya. BTW, saya ingin sekali menggunakan nio, tetapi rasa Linux di sini tidak mendukung pembuatan file.
Todd

Jawaban:

163

Java nio memiliki opsi untuk mengakses creationTime dan meta-data lainnya selama sistem berkas menyediakannya. Periksa link ini keluar

Misalnya (Disediakan berdasarkan komentar @ 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());
Pembawa cincin
sumber
16
Ini akan menjadi yang terbaik, tetapi ini adalah Java 7. Kami masih menggunakan 6, tetapi saya akan menyelidiki opsi peningkatan kami.
Todd
1
Fantastis. Persis yang saya butuhkan.
RestInPeace
7
gunakan readAttributes(file.toPath(), BasicFileAttributes.class)lagi yang Anda dapatkan: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))
Hooli
1
@Hooli Jangan khawatir, sobat! Coba logicbig.com/how-to/java/file-creation-date.html ini .
Socrates
1
Tanggal pembuatan file tidak tersedia di JDK 8 (setidaknya) sejak statxsyscall ditambahkan di versi kernel Linux yang lebih baru.
St. Antario
15

Saya telah memecahkan masalah ini menggunakan JDK 7 dengan kode ini:

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));
        }
    }
}
Oleksandr Tarasenko
sumber
13

Sebagai tindak lanjut dari pertanyaan ini - karena secara khusus berkaitan dengan waktu pembuatan dan membahas cara mendapatkannya melalui kelas nio baru - tampaknya saat ini dalam implementasi JDK7 Anda kurang beruntung. Tambahan: perilaku yang sama ada di OpenJDK7.

Pada sistem file Unix Anda tidak dapat mengambil stempel waktu pembuatan, Anda cukup mendapatkan salinan waktu modifikasi terakhir. Sedih sekali, tapi sayangnya benar. Saya tidak yakin mengapa itu tetapi kode secara khusus melakukan itu seperti yang akan ditunjukkan berikut ini.

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);
    }
  }
}
David Nugent
sumber
1
Apakah Anda tahu cara melakukannya untuk Android? BasicFileAttributes tidak tersedia sebagai API bawaan di sana ...
pengembang android
Ini memang benar, bahkan panggilan untuk stattidak berhasil. Kecuali jika Anda menjalankan kernel lebih tinggi dari 4.11 dengan glibc lebih tinggi dari 2.28, dan coreutils lebih tinggi dari 8.31, maka statakan melaporkan kelahiran file. Lihat jawaban terkait unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/… Saat ini JDK tidak menggunakan statx syscal.
Brice
12

Ini adalah contoh dasar bagaimana mendapatkan tanggal pembuatan file Java, menggunakan BasicFileAttributesclass:

   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());
}
Jorgesys
sumber
Orang yang ingin menggunakan kelas ini harus memperhatikan bahwa kelas ini mulai dikirim di Java 1.7.
jwj
9

API java.io.Filehanya mendukung mendapatkan waktu modifikasi terakhir . Dan Internet juga sangat diam tentang topik ini.

Kecuali jika saya melewatkan sesuatu yang penting, pustaka Java apa adanya (hingga tetapi belum termasuk Java 7) tidak menyertakan kemampuan ini. Jadi jika Anda putus asa untuk ini, salah satu solusinya adalah menulis beberapa kode C (++) untuk memanggil rutinitas sistem dan menyebutnya menggunakan JNI. Sebagian besar pekerjaan ini tampaknya sudah dilakukan untuk Anda di perpustakaan yang disebut JNA .

Anda mungkin masih perlu melakukan sedikit pengkodean khusus OS di Java untuk ini, karena Anda mungkin tidak akan menemukan panggilan sistem yang sama tersedia di Windows dan Unix / Linux / BSD / OS X.

Carl Smotricz
sumber
2
Ya, Java 7 akan bagus karena nio tampaknya memiliki atribut dasar ini. Tidak pernah terpikir saya akan mengeluh karena lahir terlalu dini! ;)
Todd
6
Alasan Filekelas tidak memiliki kemampuan ini adalah karena kebanyakan sistem file tidak melacak informasi ini. Dan yang tidak selalu setuju kapan harus diperbarui.
Sintaksis
@Syntactic: Sebenarnya kebanyakan sistem file melacak informasi ini . Pengecualian termasuk ext <= 3 dan Reiser. FAT, NTFS, HFS, ZFS, dan ext4 mendukungnya. Tetapi lambat untuk menyebar melalui semua lapisan Linux dan perpustakaan dan perintah untuk membuatnya digunakan secara universal.
hippietrail
@Carl Di linux, saya mendapatkan tanggal modifikasi dan pembuatan yang sama saat menggunakan Java NIO. Apakah ini perilaku normal?
Jayesh Dhandha
@JayeshDhandha, jika tidak ada yang mengubah file setelah dibuat, saya berharap waktu pembuatan dan modifikasi sama. Anda dapat mencoba mengubahnya dengan menggunakan touchuntuk mengubah waktu mod dan kemudian memeriksa lagi.
Carl Smotricz
9

Pada sistem Windows, Anda dapat menggunakan pustaka FileTimes gratis .

Ini akan lebih mudah di masa mendatang dengan Java NIO.2 (JDK 7) dan paket java.nio.file.attribute .

Namun perlu diingat bahwa sebagian besar sistem file Linux tidak mendukung stempel waktu pembuatan file .

Jacek S
sumber
Adakah cara lain untuk mesin linux yang tidak mendukung waktu yang diciptakan?
Maverick
Cukup gunakan sistem file yang mendukung cap waktu pembuatan file. Artikel Wikipedia yang ditautkan menyarankan ext4 yang cukup umum sekarang.
davtom
1

di java1.7 + Anda dapat menggunakan kode ini untuk mendapatkan waktu pembuatan file!

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());
    }
zhangxinqiang.dll
sumber
bisakah Anda menjelaskan mengapa kita membutuhkan keributan ini Instant.ofEpochMilli(date). Terima kasih
Kirill Karmazin