Java如何获取目录下最新创建(非最后修改)的文件夹名称/路径
Java获取指定目录下最后创建(非最后修改)的文件夹路径/名称
实现前提
- 要求JDK版本为7及以上,低版本(JDK6及更早)无原生API支持直接读取文件创建时间,只能通过调用系统命令解析输出,兼容性极差,不推荐使用
- 运行环境的文件系统需要支持记录文件创建时间:Windows NTFS、macOS APFS/HFS+、Linux ext4/btrfs/xfs等主流现代文件系统均满足要求;ext3等老旧文件系统不记录创建时间时,接口会回退返回最后修改时间,结果不符合需求
- 禁止使用
File.lastModified()方法,该方法返回的是文件夹最后修改时间,和创建时间完全无关,无法满足需求
可直接复用的实现代码
import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.util.Comparator; import java.util.Optional; import java.util.stream.Stream; public class LastCreatedDirectoryFinder { /** * 查询目标目录下最后创建的子文件夹 * @param targetPath 要查询的目标目录路径 * @return 最后创建的文件夹路径对象,目标目录无有效子文件夹时返回空Optional * @throws IOException 目录不存在、无读取权限等IO异常 */ public static Optional<Path> getLastCreatedSubDir(String targetPath) throws IOException { Path dir = Paths.get(targetPath); // 先校验传入路径是有效存在的目录 if (!Files.isDirectory(dir)) { throw new IllegalArgumentException("传入路径不是有效可访问目录: " + targetPath); } // try-with-resources自动关闭目录流,避免文件句柄泄漏 try (Stream<Path> subPathStream = Files.list(dir)) { return subPathStream // 第一次过滤:只保留子目录,排除普通文件 .filter(Files::isDirectory) // 第二次过滤:排除符号链接指向的目录,不需要可以删掉这一段 .filter(path -> { try { return !Files.isSymbolicLink(path); } catch (IOException e) { throw new RuntimeException("路径属性读取失败: " + path, e); } }) // 按创建时间倒序取最大值,即为最后创建的文件夹 .max(Comparator.comparingLong(path -> { try { BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class); return attr.creationTime().toMillis(); } catch (IOException e) { throw new RuntimeException("文件夹创建时间读取失败: " + path, e); } })); } } // 调用示例 public static void main(String[] args) throws IOException { Optional<Path> lastCreatedDir = getLastCreatedSubDir("D:\\your-target-directory"); if (lastCreatedDir.isPresent()) { Path dir = lastCreatedDir.get(); System.out.println("最后创建的文件夹名:" + dir.getFileName()); System.out.println("最后创建的文件夹完整路径:" + dir.toAbsolutePath()); } else { System.out.println("目标目录下没有符合条件的子文件夹"); } } }
调整说明
- 如果需要把符号链接指向的文件夹也纳入统计,直接删除代码中第二次filter的逻辑块即可
- 如果需要递归查询所有层级子目录里最后创建的文件夹,把
Files.list(dir)换成Files.walk(dir)即可,注意Files.walk默认会递归遍历所有子层级,可传入深度参数控制遍历深度 - 返回的Path对象可以直接通过
getFileName()获取文件夹名称,toAbsolutePath()获取完整绝对路径,不需要额外做字符串拼接
内容的提问来源于stack exchange,提问作者ariana
相关产品推荐
相关产品推荐

