【问题标题】:"last accessed" vs "last modified" file date in java (windows)java中的“最后访问”与“最后修改”文件日期(Windows)
【发布时间】:2013-02-11 10:15:02
【问题描述】:

我的 windows 目录中有一组从其他地方复制的文件。 在检查其中一个文件的属性时(右键单击 -> 属性),它显示:

创建时间:今天,2013 年 2 月 11 日,下午 2:51:56

修改时间:2013 年 1 月 1 日,星期二,上午 8:30:04

访问时间:今天,2013 年 2 月 11 日,下午 2:51:56

“创建”和“访问”字段主要显示文件实际复制到新目录的时间,而“修改”字段显示原始文件的修改日期。

在 Java 中使用 file.lastModified() 我得到的是“已访问”(或“已创建”)时间戳。 有没有办法获取原始文件的“修改”值?

【问题讨论】:

    标签: java windows last-modified


    【解决方案1】:

    除了在 Java 7 中使用“外部”库(如提到的 JavaXT)外,您还可以使用新的文件 API(查看此 Java 7 nio.2 tutorial)。

    File attribFile = new File("/tmp/file.txt");
    Path attribPath = attribFile.toPath();
    BasicFileAttributeView basicView =
        attribPath.getFileAttributeView(BasicFileAttributeView.class);
    BasicFileAttributes basicAttribs = basicView.readAttributes();
    
    System.out.println("Created: " + basicAttribs.creationTime());
    System.out.println("Accessed: " + basicAttribs.lastAccessTime());
    System.out.println("Modified: " + basicAttribs.lastModifiedTime());
    

    查看this article 以获取更多示例。

    【讨论】:

    • 谢谢,Java 7 有这个新特性听起来很有趣,但稍后会试用 Java 7。现在需要让这个项目在 Java 6 上工作:)。上面提到的 JavaXT 库没有多大帮助。
    【解决方案2】:

    您可以添加this JavaXT library,然后您就可以执行以下操作:

    javaxt.io.File file = new javaxt.io.File("/tmp/file.txt");
    System.out.println("Created: " + file.getCreationTime());
    System.out.println("Accessed: " + file.getLastAccessTime());
    System.out.println("Modified: " + file.getLastModifiedTime());
    

    【讨论】:

    • 感谢您的回复。但这并不能解决问题。对于同一文件,上述 sysout 语句的输出为: 创建时间:2013 年 2 月 11 日星期一 14:50:08 IST 访问:2013 年 2 月 11 日星期一 16:05:16 IST 2013 年修改:2013 年 2 月 11 日星期一 14:52:09 IST 虽然从 Windows 属性菜单中,它显示: 创建时间:今天,2013 年 2 月 11 日,下午 2:50:09 修改时间:2012 年 11 月 19 日,星期一,晚上 10:30:23 访问时间:今天,2013 年 2 月 11 日,4:下午 4 点 45 分
    • 在 Windows 上,javaxt-core 库直接从 Windows API 返回“最后修改”日期,因此它应该是正确的(即它调用 GetFileAttributesExW 函数并解析WIN32_FILE_ATTRIBUTE_DATA)。有谁知道可用于检索复制文件的原始修改/创建日期的不同 Windows API?
    • @tajji 我使用 mjuarez 针对 2011 年创建的文件发布的代码运行了一个简单的测试。这是来自 javaxt 的标准输出: 创建时间:2012 年 1 月 19 日星期四 09:25:08 EST 访问时间:1 月 19 日星期四09:25:08 EST 2012 已修改:Mon Nov 28 09:15:34 EST 2011 我使用 Windows 文件资源管理器复制了文件,并获得了新文件的以下标准输出。创建时间:2013 年 2 月 11 日星期一 22:26:26 EST 访问时间:2013 年 2 月 11 日星期一 22:26:26 EST 修改时间:2011 年 11 月 28 日星期一 09:15:34 EST 修改日期保持不变。此外,标准输出中的日期与 Windows 属性对话框中列出的日期相匹配。您的文件是如何复制的?
    【解决方案3】:

    就 JavaXT 和 Java 7 不适合您而言,如果您准备只坚持使用 Windows 平台,您可以尝试一些更奇特的方法。就大多数*nix文件系统而言,文件创建属性是不存在的,所以它似乎没有很大的限制。

    1)。

    的输出
        Runtime.getRuntime().exec("cmd /c dir c:\\logfile.log /tc");
    

    工作示例here

    2)。尝试另一个“外部”库。例如。 FileTimes

    3)。您可以利用 JNA 直接调用 Windows API 函数。顺便说一句,当我试图找到带有 JNA 和文件属性函数的代码示例时,我找到了this question,所以你的问题似乎是重复的:-)

    【讨论】:

      猜你喜欢
      • 2016-09-06
      • 1970-01-01
      • 2011-05-20
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 2020-05-12
      相关资源
      最近更新 更多