用Java确定文件创建日期

时间:2010-04-27 18:19:46

标签: java date filesystems

在StackOverflow(How to get creation date of a file in Java)上还有另一个类似的问题,但答案并不是真的存在,因为OP有不同的需求可以通过其他机制解决。我正在尝试创建一个目录中的文件列表,该列表可以按年龄排序,因此需要文件创建日期。

在网上拖网之后,我没有找到任何好办法。是否有获取文件创建日期的机制?

BTW,目前在Windows系统上,也可能需要在Linux系统上运行。此外,我无法保证在名称中嵌入创建日期/时间时将遵循文件命名约定。

7 个答案:

答案 0 :(得分:146)

Java nio 具有访问creationTime和其他元数据的选项,只要文件系统提供它即可。 检查this link

例如(根据@ 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());

答案 1 :(得分:13)

我已使用此代码使用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));
        }
    }
}

答案 2 :(得分:12)

作为这个问题的后续行动 - 因为它特别涉及创建时间并讨论通过新的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);
    }
  }
}

答案 3 :(得分:11)

这是如何使用BasicFileAttributes类在:call中获取文件创建日期的基本示例:

Java

答案 4 :(得分:9)

java.io.File的API仅支持获取最后修改时间。互联网也非常安静。

除非我遗漏了重要内容,否则Java库(包括Java 7)尚不包括此功能。因此,如果您对此非常不满,一种解决方案是编写一些C(++)代码来调用系统例程并使用JNI调用它。但是,大多数这项工作似乎已经在名为JNA的库中完成了。

尽管如此,您可能仍需要在Java中执行一些特定于操作系统的编码,因为您可能找不到Windows和Unix / Linux / BSD / OS X中可用的相同系统调用。

答案 5 :(得分:9)

在Windows系统上,您可以使用免费的FileTimes库。

Java NIO.2 (JDK 7) and the java.nio.file.attribute package将来会更容易。

但请记住大多数Linux文件系统don't support file creation timestamps

答案 6 :(得分:0)

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