java - 如何递归搜索文件并跳过没有足够权限的文件?
问题描述
因此,我最近发布了一个在递归搜索文件时收到的错误,这是因为我需要超级用户权限才能查看文件。我对此并不真正感兴趣,所以我浏览了网络,我最好的选择就是使用一个try/catch
语句,但问题是我正在使用的方法(见下文)如果它得到一个将完全停止错误,然后如果我再次启动它,它将完全重新启动。
所以这里是代码:
Files.walk(Paths.get("C:\\"))
.filter(Files::isRegularFile)
.forEach(System.out::println);
如何跳过我没有足够权限查看的文件?
解决方案
使用访客而不是步行。这使您即使在失败的情况下也可以继续。我在一个给出类似错误的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());
推荐阅读
- google-api - 如何使用 Google apiKey 在 node.js 中访问 google drive 和 google sheet
- docker - Docker 容器中的新 DotNet Core VSTS 代理
- installation - Windows 无人值守安装 - 以特定用户身份运行脚本
- javascript - 检查是否选择了一个选项并编辑 HTML 标记
- acumatica - 如何在自定义项目浏览器中引用 .dll 文件
- regex - 使用正则表达式以正确的方式将 Youtube 频道主页重定向到视频部分
- amazon-web-services - 从 dynamodb 获取具有给定值的特定对象
- azure - 我们如何在本地机器和 Azure VM 之间同步代码?
- r - 索引边缘序列 igraph - 特殊功能和前缀形式
- java - com.google.android.gcm.server.InvalidRequestException:发送 FCM 消息