用Java确定文件的年龄

时间:2016-02-08 02:08:31

标签: java

我需要确定文件在NTFS文件系统上的持续时间。

我可以读取文件创建时间,系统时间以毫秒为单位,但两者不加。他们已经离开了好几年。 NTFS Epoc是1月1601年1月160日UTC时间,而Java Epoc是1970年1月1日。此外,NTFS时间以100纳秒为单位。

考虑到所有这些因素,它仍然没有加起来。我哪里错了?

public static final double secondsPerJulianYear = 316880878;
public static final double minutesPerJulianYear = 5281347.966666667;
public static final double secondsPerMinute = 60.0;
public static final double millisPerSecond = 1000.0;
public static final double yearsJavaTimeAhead = 369.0;

public static long ntfsFileCreationTime(final File file) {
    FileTime fileCreationTime = null;
    try {
        Path filePath = Paths.get(file.toURI());
        if (Files.exists(filePath)) {
            BasicFileAttributes attributes = Files.readAttributes(filePath, BasicFileAttributes.class);             
            fileCreationTime = attributes.creationTime();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    return getJavaMillisFromNtfsTime(fileCreationTime.toMillis());
}

public static long getJavaMillisFromNtfsTime(final long ntfsTime) {
    double ntfsNanos = ntfsTime * 100; // An NTFS time unit is equal to 100 nanoseconds 
    double ntfsMillis = (ntfsNanos / 10E6); // There are 10e6 nanoseconds in a millisecond
    double millisJavaEpocAhead = yearsJavaTimeAhead * minutesPerJulianYear * secondsPerMinute * millisPerSecond;
    return (long) (ntfsMillis - millisJavaEpocAhead);
}

According to Windows 7, the creation date is: 1/6/2016
This is the console output of one of the files: 

System.currentTimeMillis(): 1454896412295
fileCreationTime(fileName): -116929029460761
file age: 118383925873056  

1 个答案:

答案 0 :(得分:3)

来自FileTime

的Javadoc
  

public static FileTime fromMillis(long value)

     

返回

     

表示给定值的FileTime,以毫秒为单位。

     

参数:

     

价值 -   自纪元以来的价值(以毫秒为单位)(1970-01-01T00:00:00Z);可   negative返回:表示给定值的FileTime

注意,那个纪元是相同的,时间是毫秒。

所以你的方法应该是

public static long getJavaMillisFromNtfsTime(final long ntfsTime) {
     return ntfsTime;
}

注意:当您收到例外情况时,您无法继续并假装它没有发生。在您的情况下,您将获得NullPointerException。我建议您不要捕获IOException或返回一个明显无效的值,如Long.MIN_VALUE