在Java7中解决文件遍历树中拒绝访问的问题

在Java7中解决文件遍历树中拒绝访问的问题,java,io,nio,Java,Io,Nio,下面是一些简单的代码,用于测试Files.walkFileTree()方法。但是,拥有这些权限(rwx--x--)的文件夹/etc/ssl/private)抛出了一个异常,即使我认为我用if语句(if(permissions.equals(“rwx--x--”)保护了它 我做错了什么?提前谢谢 public static void main (String []args) throws IOException, InterruptedException { Files.wa

下面是一些简单的代码,用于测试
Files.walkFileTree()
方法。但是,拥有这些权限(
rwx--x--
)的文件夹
/etc/ssl/private
)抛出了一个异常,即使我认为我用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

编辑:通过覆盖
访问文件失败
解决:

public FileVisitResult visitFileFailed(Path file, IOException io)
{   
    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;
    }
    
    Set perm=posixAttr.permissions();
    if(perm.contains(OWNER_READ)| perm.contains(GROUP_READ)| perm.contains(OTHERS_READ)){
    返回FileVisitResult.SKIP_子树;
    }
    

  • 如果您正在遍历整个目录系统,并且出现了某种类型的异常,如
    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;
    } 
    

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

    几分钟前你问了完全相同的问题,然后将其删除。为什么这个问题有什么不同?@Xynariz,因为我只需在FileVisit中尝试一下就解决了上一个问题。下面是另一个问题java.nio.file.AccessDeniedException:/etc/ssl/private然后用同样的方法捕获
    AccessDeniedException
    。你可以在一个
    try
    块上有多个
    catch
    语句。你有将近2000个rep,还没有学会如何格式化你的代码?请使用IDE的自动格式化功能并编辑你的帖子。例如,我不能跟随那一团糟…为什么这个检查不起作用?
    if(permissions.equals(“rwx--x--”)if{return FileVisitResult.CONTINUE;}