在Java7中的FileWalking树中解决访问被拒绝的问题
以下是一些简单的代码,仅用于测试Files.walkFileTree()
方法。 但是,具有这些权限( rwx--x---
)的文件夹/etc/ssl/private
会抛出exception,即使我认为我用if语句保护它( if (permissions.equals("rwx--x---")
)。
我究竟做错了什么? 提前致谢。
public static void main (String []args) throws IOException, InterruptedException { Files.walkFileTree(Paths.get("/"), new WalkingTheThing2()); } @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { PosixFileAttributeView posixView = Files.getFileAttributeView(dir, PosixFileAttributeView.class); PosixFileAttributes posixAttr = posixView.readAttributes(); String permissions =PosixFilePermissions.toString(posixAttr.permissions()); if (permissions.equals("rwx--x---")) { return FileVisitResult.SKIP_SUBTREE; } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { try{ System.out.println(file.getFileName()+" " +Files.size(file)); return FileVisitResult.CONTINUE; } catch(IOException io){return FileVisitResult.CONTINUE;} }
我得到的例外是: java.nio.file.AccessDeniedException: /etc/ssl/private
编辑 :通过覆盖visitFileFailed
解决:
public FileVisitResult visitFileFailed(Path file, IOException io) { return FileVisitResult.SKIP_SUBTREE; }
虽然覆盖visitFileFailed
解决了你的问题,但它可能隐藏了你仍然做错了几件事:
-
Files.getFileAttributeView
可以返回null(例如,如果文件系统不支持POSIX文件权限),使得posixView.readAttributes()
失败 -
posixView.readAttributes()
本身可以抛出exception(例如,如果你没有读取文件权限所需的权限) – 这可能是你得到的AccessDeniedException
的原因 -
并非完全错误,但比较权限的字符串表示forms可能不适合此用例,除非您要显式检查文件是否具有给定的权限 – 并且没有其他权限; 另一种方法是检查所需的权限:
Set
perm = posixAttr.permissions(); if (perm.contains(OWNER_READ) || perm.contains(GROUP_READ) || perm.contains(OTHERS_READ)) { return FileVisitResult.SKIP_SUBTREE; }
如果您正在遍历整个目录系统,并且存在某种类型的Exception(如AccessDeniedException
并且您希望跳过该文件以便您可以检查其他文件,则需要覆盖 visitFileFailed
并跳过该文件或目录。
@Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { System.err.printf("Visiting failed for %s\n", file); return FileVisitResult.SKIP_SUBTREE; }
这是我在遍历目录系统时找到的工作。