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,这对于每个实现都是不同的。
添加回答
举报