代码之家  ›  专栏  ›  技术社区  ›  Paul Taylor

文件夹。存在(path)和path.toFile()。exists()为同一文件提供不同的结果

  •  14
  • Paul Taylor  · 技术社区  · 9 年前

    我得到了不同的结果 Files.exists(path) path.toFile().exists() 用于Windows上的本地文件。我可以在Windows资源管理器中看到这个文件,尽管我有(随机)修改的权限,也许这些权限没有意义。

    然而,这并不能解释为什么旧方法返回true,而新方法返回false。该文件确实存在,但运行Java代码的用户可能看不到它,所以我不确定正确答案应该是什么。我也看不到如何查看哪个用户在运行代码,只有一个真正的用户 保罗 但是我想知道如果以管理员身份运行是否会影响某些事情。

    System.out.println("Path Exists(1):"+Files.exists(path));
    System.out.println("Path Exist(2) :"+path.toFile().exists());
    

    给予

    Path Exists(1):false
    Path Exist(2) :true
    

    而且

    System.out.println("Path readable(3) :"+Files.isReadable(path));
    System.out.println("Path readable(4):"+path.toFile().canRead());
    

    以同样的方式给予

    Path readable(3) :false
    Path readable(4):true
    

    权限输出

    File C:\Code\jthink\opensrc\jaudiotagger\testdata\test157.dsf permissions
    owner:PCLAPTOP\Paul
    NT AUTHORITY\SYSTEM:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:DENY
    BUILTIN\Administrators:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:DENY
    BUILTIN\Administrators:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:ALLOW
    NT AUTHORITY\SYSTEM:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:ALLOW
    BUILTIN\Users:READ_DATA/READ_NAMED_ATTRS/EXECUTE/READ_ATTRIBUTES/READ_ACL/SYNCHRONIZE:ALLOW
    NT AUTHORITY\Authenticated Users:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/SYNCHRONIZE:ALLOW
    
    
    c:\Code\jthink\opensrc\jaudiotagger>attrib C:\Code\jthink\opensrc\jaudiotagger\testdata\test157.dsf
    A    R       C:\Code\jthink\opensrc\jaudiotagger\testdata\test157.dsf
    

    使现代化 我没有结论,但认为这些信息可能有用。

    我在没有IDE的IntelliJ IDE中运行代码 以管理员身份运行程序 选项启用,启用该选项会导致Java应用程序也获得管理员权限。

    有趣的是,另一个文件我没有添加任何DENY权限,我只是禁用了继承权限并从所有组中删除了READ权限。然后,当我以用户身份运行而没有启用管理员身份运行时,它无法读取文件,并且此代码也无法输出任何信息

    AclFileAttributeView view = Files.getFileAttributeView(path, AclFileAttributeView.class);
    if (view != null)
    {
        sb.append("Owner:"+view.getOwner().getName()+"**");
        for (AclEntry acl : view.getAcl())
        {
            sb.append(acl.principal()+"**");
            for(AclEntryPermission aep:acl.permissions())
            {
                sb.append(aep.toString() + "**");
            }
        }
    }
    

    但当我和 以管理员身份运行程序 启用后,它仍然无法读取文件,但上面的代码现在确实输出了一些权限,如下所示:

    所有者:BUILTIN\Administrators

    NT AUTHORITY\SYSTEM:WRITE_DATA/APPEND_DATA/WRITE_NAMED_ATTRS/WRITE_ATTRIBUTES/SYNCHRONIZE:ALLOW PCLAPTOP\Paul:WRITE_DATA/APPEND_DATA/WRITE_NAMED_ATTRS/WRITE_ATTRIBUTES/SYNCHRONIZE:允许 BUILTIN\Administrators:WRITE_DATA/APPEND_DATA/WRITE_NAMED_ATTRS/WRITE_ATTRIBUTES/SYNCHRONIZE:ALLOW

    正如你所看到的 Administrators 没有 READ READ PERMISSIONS 选项,它们可以输出权限,而在它们无法输出之前,可能是由于BUILTIN/Administraor作为所有者返回。

    2 回复  |  直到 8 年前
        1
  •  8
  •   PNS    9 年前

    尝试阅读以下内容: https://docs.oracle.com/javase/tutorial/essential/io/check.html

    它指出, Files.exists(path) 返回false并不意味着它不存在,所以是的,似乎存在权限问题。尝试 Files.notExists(path) 看看它的回报。如果为false,则意味着无法确定文件是否存在,但如果返回true,则代码可能存在问题。

    尝试从命令行而不是netbeans运行文件。如果你不知道如何做到这一点,你可以搜索谷歌,这上面有很多东西,但基本上你想做的是用 javac myfile.java 然后用 java myfile 。使用普通命令提示符执行此操作,然后以管理员身份打开一个命令提示器,然后查看结果。

        2
  •  4
  •   Alkanshel    7 年前

    有两种不同的方法:文件。exists()和path.toFile().exists()。

    Files.exists() 定义由该抽象路径名表示的文件存在。换句话说,该文件存在,并且用户对其具有READ访问权限。

    path.toFile().exists() 指示文件存在,则无法保证子序列访问将成功。换句话说,文件存在时未检查用户是否具有对其的READ访问权限。

    这实际上取决于运行程序的用户。当你用你的ID(Paul)工作时,它工作得很好。尤其是在命令行中,您可以使用ATTRIB命令。

    然而,当您使用其他应用程序运行代码时,这取决于系统配置。在应用程序中运行此ATTRIB或类似命令,您将看到。

    我想你在IIS下运行一些网站。这种方式通常是为系统中几乎没有权限防止安全漏洞的最低级别用户配置的。通常是每个人或NT当局。正如我所看到的,这个特定的访问权限无权读取您的文件

    NT权限\SYSTEM:READ_DATA/…:拒绝

    当然,您有两个不同的答案-FALSE:运行应用程序使用的用户ID无法读取该文件,TRUE:文件实际存在。

    更改应用程序的运行ID或授予每个人对该特定文件(包括其路径中的所有目录)的READ访问权限,这两种检查不同含义的方法将得到相同的结果。