如何保护 Files.walk 免受符号链接递归的影响?
How to protect Files.walk from symbolic links recursion?
如何保护 Files.walk 免受符号链接递归的影响?
使用 Java 或 shell.
您可以使用 FileVisitOption
参数化 Files.walk
调用。
如果不加FileVisitOption.FOLLOW_LINKS
,抓取将不会跟随符号链接。
参见 API here。
好的,所以请关注 links。
Stream<Path> stream = walk(startPath, maxDepth, FileVisitOption.FOLLOW_LINKS);
但是检查每个目录是否是符号 link:
Files.isSymbolicLink(path) && Fles.isDirectory(path)
使用
Path realPath = path.toRealPath();
那么保留一个目录列表就可以了,祖先们,这样可以防止递归。通过为 每个 目录检查祖先,当符号 link 位于 list/current 路径中时。
a > b > START:c > d > e > SYMBOLIC:f=a > b > c
(这仍然不能阻止访问一个目录两次,因为可以在不递归的情况下 link 编辑同一个目录或子目录。)
Files.walk
似乎不受符号 link 递归的保护。您可以通过将 maxDepth
设置为合理的值来限制搜索深度,例如 i.d.k。 200左右?
如果您需要比任意限制深度更强大的方法,您可以实施 FileVisitor
which when it encounters a symbolic link does some checking to see if it is recursive and then decide if you want to follow it or not. Then use the visitor with Files.walkFileTree
。但是,这不会为您提供良好的路径流,因此您可能必须对代码进行一些调整。
至于检测递归的符号 link,我认为您可以使用 File.getCanonicalPath
和已访问规范路径的散列映射来施展魔法。我手边没有 linux 机器,所以我还没有测试过,YMMV。
无论您做什么,都不要像其他答案所建议的那样使用 List
访问路径,因为这会给您 O(n²) 时间来遍历文件系统。
如何保护 Files.walk 免受符号链接递归的影响? 使用 Java 或 shell.
您可以使用 FileVisitOption
参数化 Files.walk
调用。
如果不加FileVisitOption.FOLLOW_LINKS
,抓取将不会跟随符号链接。
参见 API here。
好的,所以请关注 links。
Stream<Path> stream = walk(startPath, maxDepth, FileVisitOption.FOLLOW_LINKS);
但是检查每个目录是否是符号 link:
Files.isSymbolicLink(path) && Fles.isDirectory(path)
使用
Path realPath = path.toRealPath();
那么保留一个目录列表就可以了,祖先们,这样可以防止递归。通过为 每个 目录检查祖先,当符号 link 位于 list/current 路径中时。
a > b > START:c > d > e > SYMBOLIC:f=a > b > c
(这仍然不能阻止访问一个目录两次,因为可以在不递归的情况下 link 编辑同一个目录或子目录。)
Files.walk
似乎不受符号 link 递归的保护。您可以通过将 maxDepth
设置为合理的值来限制搜索深度,例如 i.d.k。 200左右?
如果您需要比任意限制深度更强大的方法,您可以实施 FileVisitor
which when it encounters a symbolic link does some checking to see if it is recursive and then decide if you want to follow it or not. Then use the visitor with Files.walkFileTree
。但是,这不会为您提供良好的路径流,因此您可能必须对代码进行一些调整。
至于检测递归的符号 link,我认为您可以使用 File.getCanonicalPath
和已访问规范路径的散列映射来施展魔法。我手边没有 linux 机器,所以我还没有测试过,YMMV。
无论您做什么,都不要像其他答案所建议的那样使用 List
访问路径,因为这会给您 O(n²) 时间来遍历文件系统。