【问题标题】:Find files based on glob根据 glob 查找文件
【发布时间】:2017-04-18 17:05:46
【问题描述】:

我有一个 glob,它可能看起来像 *.txt,在这种情况下,我想在当前目录中搜索文本文件。或者它可能看起来像 **/*.txt,在这种情况下,我想遍历文件树来查找文件。

当传入 *.txt 时,DirectoryStream 会做我想做的事,而当我有 **/*.txt 时,Files.walk 会工作。 java 8 中是否有一种基于我的 glob(或者更确切地说是我的 PathMatcher)的方法?

【问题讨论】:

  • Files.walk 有什么问题? javapapers.com/java/glob-with-java-nio
  • 所以我正在接受一个根目录和一个全局模式。如果我得到 *.txt,它应该只搜索那个目录。用户通过模式表明他们是否想要子目录,即**/*.txt
  • 我想我找到了答案。 walk(Path start, int maxDepth, FileVisitOption... options) 我想我可以有一个 if 语句并在必要时将 maxDepth 设置为 0
  • 也许像github.com/EsotericSoftware/wildcard 这样的外部库可以提供帮助
  • ** 是否可以出现在模式的中间,例如 /home/steve/**/*.txt

标签: java java-8


【解决方案1】:

这是我想出的,让它遍历目录或不基于模式(请注意,此代码使用 groovy,但与纯 java 8 解决方案没有太大区别)

Path src = filesystem.getPath(job.srcDir)
int numSubDirs = job.pattern.contains("**") ? Integer.MAX_VALUE : 1

        Files.walk(src, numSubDirs)
                .filter{Path path -> filesystem.getPathMatcher("glob:${job.pattern}").matches(path.getFileName())}
                .filter{Path path -> job.days ? (new Date()) - new Date(path.toFile().lastModified()) <= job.days : true}
                .each{ Path path ->
                    actions[job.action](job, path)
                    fileCount++
                }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    相关资源
    最近更新 更多