gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:59:27 25 4
gpt4 key购买 nike

我想找出文件的创建日期,并在 SO 上找到了几个非常相似的答案。我的问题是,如果文件从一个文件夹移动到另一个文件夹,它就不起作用。我根本没有修改文件 - 只是将它复制到另一个目录。

//file location before copy paste C:\\Users\\momo\\temp\\A.csv
File 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);

要重现这一点,您只需复制一个旧文件并将其粘贴到另一个目录中。资源管理器显示旧日期,但上述代码的输出是它被复制的时间。

最佳答案

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

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

Attempts to copy the file attributes associated with this file to the target file. The exact file attributes that are copied is platform and file system dependent and therefore unspecified. Minimally, the last-modified-time is copied to the target file if supported by both the source and target file stores. Copying of file timestamps may result in precision loss.

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

如您所见,至少只有最后修改时间 会被复制,即使这样也不一定能保证。这也表明问题可能是特定于平台的;如果 Windows,或者至少是 Java 使用的 Windows API,不支持保留创建时间,那么您所看到的就是预期的行为。但如果您认为该行为是一个错误,您可以随时 submit a bug report .但是,在您这样做之前,请确保报告 doesn't already exist ,包括已解决的问题,例如“不会修复”。

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

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

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 实例。否则,该方法委托(delegate)给共享的 FileSystemProvider,这对于每个实现都是不同的。

关于java - 复制文件的文件创建日期java nio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58202927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com