Java'da dosya oluşturma tarihini belirleyin


102

StackOverflow'da benimkine benzer başka bir soru daha var ( Java'da bir dosyanın oluşturulma tarihi nasıl alınır ), ancak OP'nin diğer mekanizmalarla çözülebilecek farklı bir ihtiyacı olduğu için cevap gerçekten orada değil. Yaşa göre sıralanabilen bir dizindeki dosyaların bir listesini oluşturmaya çalışıyorum, bu nedenle dosya oluşturma tarihine ihtiyaç var.

İnternette uzun süre dolaştıktan sonra bunu yapmanın iyi bir yolunu bulamadım. Dosya oluşturma tarihlerini almak için bir mekanizma var mı?

Şu anda bir Windows sisteminde bulunan BTW, bir Linux sisteminde de çalışmak için buna ihtiyaç duyabilir. Ayrıca, oluşturma tarihinin / saatinin ada gömülü olduğu bir dosya adlandırma kuralının izleneceğini garanti edemem.


2
Tamam, dosya sistemleriyle ilgili daha fazla tartışma ve araştırmadan sonra, oluşturma tarihiyle birlikte kontrol edilmesi gerekeceği için son değiştirmenin kullanılmasının yeterli olduğuna karar verdik. Eski bir dosyanın yakın zamanda değiştirilip değiştirilmediğini ve dolayısıyla hala etkin olup olmadığını belirlemek için her ikisinin de kontrol edilmesi gerekir. Bu nedenle, geçmişte en uzağa değiştirilmiş dosyayı kontrol edin. Tüm girdiler için teşekkürler. BTW, nio'yu kullanmayı çok isterim, ancak buradaki Linux çeşidi zaten dosya oluşturmayı desteklemiyor.
Todd

Yanıtlar:


165

Java nio , dosya sistemi sağladığı sürece createTime ve diğer meta verilere erişim seçeneklerine sahiptir. Bu bağlantıya göz atın

Örneğin (@ ydaetskcoR'un yorumuna göre sağlanmıştır):

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
Bu en iyisi olur, ancak Java 7. Hala 6 kullanıyoruz, ancak yükseltme seçeneklerimizi inceleyeceğim.
Todd

1
Fantastik. Tam olarak ihtiyacım vardı.
RestInPeace

7
readAttributes(file.toPath(), BasicFileAttributes.class)aldığınız başka şeyi kullanın :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 Endişelenme dostum! Bu logicbig.com/how-to/java/file-creation-date.html'yi deneyin .
Sokrates

1
statxSistem çağrısı daha yeni Linux çekirdek sürümüne eklendiğinden, dosya oluşturma tarihi JDK 8'de (en azından) mevcut değildir .
St.Antario

15

Bu sorunu JDK 7 kullanarak şu kodla çözdüm:

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

Bu sorunun bir devamı olarak - özellikle oluşturma zamanıyla ilgili olduğundan ve yeni nio sınıfları aracılığıyla elde etmeyi tartıştığından - şu anda JDK7'nin uygulamasında şansınız yok gibi görünüyor. Ek: aynı davranış OpenJDK7'de.

Unix dosya sistemlerinde yaratma zaman damgasını alamazsınız, sadece son değişiklik zamanının bir kopyasını alırsınız. Çok üzücü ama maalesef doğru. Bunun neden olduğundan emin değilim, ancak kod bunu özellikle aşağıda göstereceği gibi yapıyor.

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
Bunu Android için nasıl yapacağınızı biliyor musunuz? BasicFileAttributes orada yerleşik API olarak mevcut değil ...
android geliştiricisi

Bu gerçekten doğrudur, bir çağrı bile statişe yaramaz. 4.11'den daha yüksek bir glibc ile 2.28'den yüksek ve temel kullanım değerleri 8.31'den yüksek bir çekirdek çalıştırmazsanız , dosyanın doğumunustat bildirir . İlgili yanıta bakın unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/… Şu anda JDK statx syscal kullanmamaktadır.
Brice

12

Bu bir dosyanın oluşturulma tarihi nasıl temel bir örnektir Javakullanarak,BasicFileAttributes sınıf :

   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());
}

Bu sınıfı kullanmak isteyen kişiler, Java 1.7'de gönderilmeye başladığını unutmamalıdır.
jwj

10

Bir Windows sisteminde, ücretsiz FileTimes kitaplığını kullanabilirsiniz .

Java NIO.2 (JDK 7) ve java.nio.file.attribute paketi ile gelecekte bu daha kolay olacaktır .

Ancak çoğu Linux dosya sisteminin dosya oluşturma zaman damgalarını desteklemediğini unutmayın .


Oluşturulan zamanı desteklemeyen linux makineleri için başka bir yol var mı?
Maverick

Dosya oluşturma zaman damgalarını destekleyen bir dosya sistemi kullanın. Bağlantılı Wikipedia makalesi, şu anda oldukça yaygın olan ext4'ü önermektedir.
davtom

9

API'si java.io.Fileyalnızca son değiştirilen zamanı almayı destekler . İnternet bu konuda da oldukça sessiz.

Önemli bir şeyi kaçırmadıysam, Java kitaplığı olduğu gibi (Java 7'ye kadar ancak henüz dahil değil) bu özelliği içermiyor. Dolayısıyla, bunun için çaresizseniz, sistem rutinlerini çağırmak ve onu JNI kullanarak çağırmak için bir çözüm C (++) kodu yazmak olacaktır. Yine de bu işin çoğu sizin için JNA adlı bir kütüphanede yapılmış gibi görünüyor .

Yine de bunun için Java'da biraz işletim sistemine özgü kodlama yapmanız gerekebilir, ancak muhtemelen Windows ve Unix / Linux / BSD / OS X'te aynı sistem çağrılarını bulamayacaksınız.


2
Evet, Java 7 harika olurdu çünkü nio temel niteliklerde buna sahip görünüyor. Erken doğmaktan şikayet edeceğimi asla düşünmedim! ;)
Todd

7
FileSınıfın bu yeteneğe sahip olmamasının nedeni, çoğu dosya sisteminin bu bilgiyi bile takip etmemesidir. Ve ne zaman güncellenmesi gerektiği konusunda her zaman hemfikir olmayanlar.
Sözdizimsel

@Syntactic: Aslında çoğu dosya sistemi bu bilgiyi izler . İstisnalar arasında ext <= 3 ve Reiser bulunur. FAT, NTFS, HFS, ZFS ve ext4 bunu destekler. Ancak Linux'un tüm katmanlarında ve kitaplıklarda ve komutlarda evrensel olarak kullanılması için yayılması yavaş oldu.
hippietrail

@Carl Linux'ta, Java NIO kullanırken aynı değişiklik ve oluşturma tarihi alıyorum. Normal davranış mı?
Jayesh Dhandha

Oluşturulduktan sonra hiçbir şey dosyasını değiştirmesi durumunda @JayeshDhandha, ben ederim bekliyoruz oluşturma ve değiştirme süreleri eşit olacak şekilde. touchMod zamanını değiştirmek için düğmesini kullanarak ve ardından tekrar kontrol ederek değiştirmeyi deneyebilirsiniz .
Carl Smotricz

1

in java1.7 + Bu kodu, dosyanın oluşturulma zamanını almak için kullanabilirsiniz!

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());
    }

Lütfen bu koşuşturmaya neden ihtiyacımız olduğunu açıklar mısınız Instant.ofEpochMilli(date)? Teşekkürler
Kirill Karmazin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.