以下是一些简单的代码,只是为了测试Files.walkFileTree()
方法。但是,具有这些权限(/etc/ssl/private
)的文件夹rwx--x---
会抛出异常,即使我认为我用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;
}
如果您正在遍历整个目录系统,并且存在某种类型的异常,例如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;
}
这是我在浏览目录系统时找到的工作。
虽然覆盖visitFileFailed
解决了你的问题,但它可能隐藏了你仍然做错了几件事:
Files.getFileAttributeView
可以返回null(例如,如果文件系统不支持POSIX文件权限)使得posixView.readAttributes()
在NPE上失败posixView.readAttributes()
本身可以抛出异常(例如,如果你没有读取文件权限所需的权限) - 这可能是你得到的AccessDeniedException
的原因Set<PosixFilePermission> perm = posixAttr.permissions();
if (perm.contains(OWNER_READ) || perm.contains(GROUP_READ) || perm.contains(OTHERS_READ)) {
return FileVisitResult.SKIP_SUBTREE;
}