首页 > 解决方案 > 如何递归搜索文件并跳过没有足够权限的文件?

问题描述

因此,我最近发布了一个在递归搜索文件时收到的错误,这是因为我需要超级用户权限才能查看文件。我对此并不真正感兴趣,所以我浏览了网络,我最好的选择就是使用一个try/catch语句,但问题是我正在使用的方法(见下文)如果它得到一个将完全停止错误,然后如果我再次启动它,它将完全重新启动。

所以这里是代码:

Files.walk(Paths.get("C:\\"))
     .filter(Files::isRegularFile)
     .forEach(System.out::println);

如何跳过我没有足够权限查看的文件?

标签: javafilerecursion

解决方案


使用访客而不是步行。这使您即使在失败的情况下也可以继续。我在一个给出类似错误的linux文件上试过这个。您可以在 Windows 中尝试相同的操作。

private static final class ExSafeVisitor extends SimpleFileVisitor<Path>
{
    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException
    {
        if (Files.isReadable(dir))
        {
            return FileVisitResult.CONTINUE;
        }
        else
        {
            return FileVisitResult.SKIP_SUBTREE;
        }
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
    {
        if (Files.isReadable(file))
        {
            System.out.println("file = " + file);
        }
        return FileVisitResult.CONTINUE;
    }

    @Override
    //print exception but proceed
    public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException
    {
        exc.printStackTrace();
        return FileVisitResult.CONTINUE;
    }
}

//Files.walk for this path in linux throws exception
Files.walkFileTree(Paths.get("/sys/kernel"), new ExSafeVisitor());

推荐阅读