在Java7中绕过FileWalking Tree中的访问被拒绝问题

16
以下是一些简单的代码,只是为了测试 "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;
}

2
你几分钟前刚刚问了完全相同的问题,然后又删除了它。为什么这个问题有所不同呢? - Xynariz
3
你的声望已经接近2000,但仍未学会格式化你的代码?请使用你的集成开发环境自带的自动格式化功能,并编辑你的帖子。我无法理解那一团糟。 - Boris the Spider
为什么这个检查不起作用?if (permissions.equals("rwx--x---")) { return FileVisitResult.CONTINUE; } - Rollerball
你的代码中,那个if语句什么也没做……无论你是否进入了if语句,你都会执行return FileVisitResult.CONTINUE。你需要做的是在你的try块中添加一个额外的catch块。 - Xynariz
@Xynariz 你说得对,是我的错!我本来想打SKIP_SUBTREE,现在正在编辑。然而它不起作用,这就是我问问题的原因。 - Rollerball
显示剩余7条评论
2个回答

2

如果您正在遍历整个目录系统,并且出现了像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;
} 

这是我在遍历目录系统时发现的解决方法。

0

虽然覆盖 visitFileFailed 解决了您的问题,但这可能掩盖了您仍在做几件事情错误的事实:

  1. Files.getFileAttributeView 可能返回 null (例如,如果文件系统不支持 POSIX 文件权限),从而使 posixView.readAttributes() 在 NPE 上失败。
  2. posixView.readAttributes() 本身可能会抛出异常(例如,如果您没有所需的权限来读取文件的权限)-这可能是您遇到的 AccessDeniedException 的原因。
  3. 并非完全错误,但比较权限的字符串表示可能不适用于此用例,除非您想明确检查文件具有给定权限,并且没有其他权限;另一种方法是仅检查所需的权限:

    Set<PosixFilePermission> perm = posixAttr.permissions();
    if (perm.contains(OWNER_READ) || perm.contains(GROUP_READ) || perm.contains(OTHERS_READ)) {
        return FileVisitResult.SKIP_SUBTREE;
    }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接