我想找出文件的创建日期,并在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);
Run Code Online (Sandbox Code Playgroud)
要重现此文件,您只需要复制一个较旧的文件并将其粘贴到另一个目录中。资源管理器显示了旧日期,但是上面代码的输出是复制日期。
我在使用OpenJDK 13的Windows 10上看到了相同的行为。尽管您提到在文件资源管理器中创建时间正确,但是在通过Java查询时却不正确。我的经历不一样;文件资源管理器显示正确的(即保留的)上次修改时间,但是,当我打开副本的属性对话框时,创建时间设置为复制文件时的时间。
请注意,虽然可能不希望保留创建时间,但是我不确定这是否会成为Java中的错误。的文档Files#copy(Path,Path,CopyOption...)说:
尝试将与此文件关联的文件属性复制到目标文件。复制的确切文件属性取决于平台和文件系统,因此未指定。
last-modified-time如果源文件存储和目标文件存储均支持,则将至少复制到目标文件。复制文件时间戳可能会导致精度损失。
-从COPY_ATTRIBUTES选项表中的描述。
如您所见,至少将仅复制上次修改的时间,即使这样也不一定能保证。这也表明该问题可能是特定于平台的;如果Windows或至少Java使用的Windows API不支持保留创建时间,那么您所看到的是预期的行为。但是,如果您认为该行为是错误,则可以随时提交错误报告。但是,在执行此操作之前,请确保尚不存在报告,包括已解决的报告,例如“ 无法解决 ”。
注意:上一段主要针对Windows。不幸的是,我目前无法访问其他操作系统,因此无法测试其他操作系统是否存在相同的问题。尽管我假设您是基于问题所在的路径(即"C:\\Users\\...")和对“ explorer”一词的使用,但您从未明确提及过您正在使用Windows 。
就是说,我认为可能有一种解决方法:复制目录或文件后,自己复制创建时间:
Files.copy(source, target, options); // 'options' should include COPY_ATTRIBUTES
Files.setAttribute(target, "creationTime", Files.getAttribute(source, "creationTime"));
Run Code Online (Sandbox Code Playgroud)
注释中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());
Run Code Online (Sandbox Code Playgroud)
可能有趣的是,Files#copy(Path,Path,CopyOption...)它与第二个示例非常相似,但前提是源和目标具有不同的FileSystemProvider实例。否则,该方法将委托给shared FileSystemProvider,这对于每个实现都是不同的。