我想列出一个目录中的所有文件以及该目录中与文件掩码匹配的子目录。
例如“m:\source*.doc”,而source可能如下所示:
|-- SOURCE
| |-- Folder1
| | |-- File1.doc
| | |-- File1.txt
| |-- File2.doc
| |-- File3.xml
应该返回file1.doc和file2.doc。
最初,我使用directorystream,因为它已经对mask/glob语法进行了一些检查,并且能够使用它进行过滤,因为这不仅仅是一些regex,而是一个普通用户更容易理解的实际文件掩码
Files.newDirectoryStream(path, mask);
问题是directorystream只检查您提供的直接路径目录,而不检查它的子目录
然后出现了一个files.walk的“扁平化”方法,它实际上能够查看所有的子目录,问题是,它不能像directorystream那样通过文件掩码“过滤”
Files.walk(path, Integer.MAX_VALUE);
所以我被困住了,不能把这两种方法最好的结合起来。。。
3条答案
按热度按时间57hvy0tb1#
我想我可能已经解决了我自己的问题与洞察力收到这里和其他问题提到
PathMatcher
对象所以基本上
.getPathMatcher("glob:" + mask);
与directorystream过滤文件的操作相同在那之后,我现在要做的就是过滤我从文件中得到的路径列表。通过删除与我的pathmatcher不匹配并且不是file类型的元素来遍历
bbmckpt72#
您还可以使用自定义
FileVisitor
[1] ,结合PathMatcher
[2] ,与globs完美配合。代码可能如下所示:
[1] https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/file/filevisitor.html
[2] https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/file/pathmatcher.html
j0pj023g3#
可以使用公共流
filter
从中检索筛选的文件名Files.walk
使用String::matches
使用适当的正则表达式:输出
输入目录结构:
更新
递归解决方案可以使用
newDirectoryStream
但是,它需要转换为流:输出:
更新2
前缀
**/
可以添加到PathMatcher
跨越目录边界Files.walk
-基于Web的解决方案可以使用简化的筛选器,而无需删除特定条目:输出(与递归解决方案相同):