以下是一些简单的代码来测试该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;}
}
Run Code Online (Sandbox Code Playgroud)
我得到的例外是: java.nio.file.AccessDeniedException: /etc/ssl/private
编辑:通过覆盖解决visitFileFailed:
public FileVisitResult visitFileFailed(Path file, IOException io)
{
return FileVisitResult.SKIP_SUBTREE;
}
Run Code Online (Sandbox Code Playgroud)
小智 0
尽管覆盖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;
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
3138 次 |
| 最近记录: |