为了账号安全,请及时绑定邮箱和手机立即绑定

复制文件的文件创建日期 java nio

复制文件的文件创建日期 java nio

牛魔王的故事 2023-09-20 17:04:37
我想找出文件的创建日期,并在此处找到了几个非常相似的答案。我的问题是,如果文件从一个文件夹移动到另一个文件夹,它就不起作用。我根本没有修改该文件 - 只是将其复制到另一个目录。//file location before copy paste C:\\Users\\momo\\temp\\A.csvFile f = new File("C:\\Users\\momo\\temp\\xyz\\A.csv");BasicFileAttributes attributes = Files.readAttributes(Paths.get(f.toURI()), BasicFileAttributes.class);FileTime fileTime = attributes.creationTime();Date date = new Date(fileTime.toMillis());System.out.println(date);要重现此情况,您只需复制旧文件并将其粘贴到另一个目录中。资源管理器显示旧日期,但上述代码的输出是复制的时间。
查看完整描述

1 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

我在使用 OpenJDK 13 的 Windows 10 上看到了相同的行为。虽然您提到文件资源管理器中的创建时间是正确的,但通过 Java 查询时则不然。我的经历是不同的;文件资源管理器显示正确的(即保留的)上次修改时间,但是当我打开副本的属性对话框时,创建时间设置为复制文件时。

请注意,虽然不保留创建时间可能是不可取的,但我不确定这是否会被视为 Java 中的错误。的文档Files#copy(Path,Path,CopyOption...)说:

尝试将与此文件关联的文件属性复制到目标文件。复制的确切文件属性取决于平台和文件系统,因此未指定。last-modified-time如果源文件存储和目标文件存储都支持,则至少会复制到目标文件。复制文件时间戳可能会导致精度损失。

COPY_ATTRIBUTES- 来自选项表中的描述。

正如您所看到的,至少只会复制最后修改时间,即使这样也不一定得到保证。这也表明问题可能是特定于平台的;如果 Windows,或者至少 Java 使用的 Windows API,不支持保留创建时间,那么您所看到的就是预期的行为。但如果您认为该行为是一个错误,您可以随时提交错误报告。不过,在此之前,请确保报告尚不存在,包括已解决的报告,例如“无法修复”的报告。

注意:以上段落主要针对 Windows。不幸的是,我目前无法访问其他操作系统,因此我无法测试其他操作系统是否有同样的问题。您从未明确提及您正在使用Windows,尽管我假设您是基于问题中的路径(即"C:\\Users\\...")以及您对“explorer”一词的使用。

也就是说,我相信可能有一个解决方法:在复制目录或文件后自行复制创建时间:

Files.copy(source, target, options); // 'options' should include COPY_ATTRIBUTES

Files.setAttribute(target, "creationTime", Files.getAttribute(source, "creationTime"));

COPY_ATTRIBUTES注释说应该包含在内的原因是,正如记录的那样,该选项可能会导致复制任意数量的属性,即使创建时间不是其中之一。当然,如果您想确保最后修改时间和访问时间也被复制,您可以将上面的内容修改为:


Files.copy(source, target, options); // 'options' should include COPY_ATTRIBUTES


BasicFileAttributes srcAttrs = Files.readAttributes(source, BasicFileAttributes.class);

BasicFileAttributeView tgtView = Files.getFileAttributeView(target, BasicFileAttributeView.class);


tgtView.setTimes(srcAttrs.lastModifiedTime(), srcAttrs.lastAccessTime(), srcAttrs.creationTime());

可能有趣的是,它Files#copy(Path,Path,CopyOption...)所做的事情与第二个示例非常相似,但前提是源和目标具有不同的FileSystemProvider实例。否则,该方法将委托给共享FileSystemProvider,这对于每个实现都是不同的。


查看完整回答
反对 回复 2023-09-20
  • 1 回答
  • 0 关注
  • 53 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信