Java Files.exists(path)和path.toFile()
对于Windows上的本地文件,Java Files.exists(path)和path.toFile(),java,security,nio,Java,Security,Nio,对于Windows上的本地文件,Files.exists(path)到path.toFile().exists(),我得到了不同的结果。我可以在Windows资源管理器中看到此文件,尽管我(随机)修改了权限,而且这些权限可能没有意义 然而,这并不能解释为什么旧方法返回true而新方法返回false。该文件确实存在,但运行Java代码的用户可能看不到它,因此我不确定正确答案应该是什么。我也看不到如何查看哪个用户正在运行代码,计算机上只有一个真正的用户Paul,但我想知道是否以管理员身份运行会产生影
Files.exists(path)
到path.toFile().exists()
,我得到了不同的结果。我可以在Windows资源管理器中看到此文件,尽管我(随机)修改了权限,而且这些权限可能没有意义
然而,这并不能解释为什么旧方法返回true而新方法返回false。该文件确实存在,但运行Java代码的用户可能看不到它,因此我不确定正确答案应该是什么。我也看不到如何查看哪个用户正在运行代码,计算机上只有一个真正的用户Paul,但我想知道是否以管理员身份运行会产生影响
System.out.println("Path Exists(1):"+Files.exists(path));
System.out.println("Path Exist(2) :"+path.toFile().exists());
给予
也
以同样的方式工作
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
更新
我没有结论,但认为这些信息可能有用
我在IntelliJ IDE中运行代码时没有启用IDE以管理员身份运行程序选项,启用该选项确实会使Java应用程序也获得管理员权限
有趣的是,对于另一个文件,我没有添加任何拒绝权限,我只是禁用了继承权限并从所有组中删除读取权限。然后,当我以用户身份运行而未启用“运行方式管理”时,它无法读取文件,并且此代码也无法输出任何信息
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() + "**");
}
}
}
但是,当我以管理员身份运行程序时,它仍然无法读取文件,但上面的代码现在确实输出了一些权限,如下所示:
所有者:内置\管理员
NT权限\系统:写入\数据/附加\数据/写入\命名\属性/写入\属性/同步:允许
PCLAPTOP\Paul:写入数据/附加数据/写入命名属性/写入属性/同步:允许
内置\管理员:写入\数据/附加\数据/写入\命名\属性/写入\属性/同步:允许
正如您所看到的,即使管理员
没有读取
或读取权限
选项,他们也可以输出权限,而以前他们无法输出权限,这可能是由于内置/administra或作为所有者返回。请尝试阅读以下内容:
它声明,Files.exists(path)
返回false并不意味着它不存在,所以是的,似乎存在权限问题。还可以尝试Files.notExists(path)
并查看它返回的内容。如果为false,则表示无法确定文件是否存在,但如果返回true,则代码中可能存在一些问题
尝试从命令行而不是netbeans运行文件。如果你不知道怎么做,你可以搜索google,上面有很多东西,但基本上你要做的是用
javac myfile.java
编译.java文件,然后用javamyfile
运行它。使用普通的命令提示符和以管理员身份打开的命令提示符执行此操作,并查看得到的结果 这些是两种不同的方法:Files.exists()和path.toFile().exists()
定义此抽象路径名表示的文件存在。换句话说,该文件存在并且用户对其具有读取权限
指示文件存在,则无法保证子序列访问将成功。换句话说,文件存在时不检查用户是否具有读取权限
这实际上取决于运行程序的用户。当你用你的身份证(保罗)工作时,它工作得很好。特别是在命令行中,您可以使用ATTRIB命令
但是,当您使用其他应用程序运行代码时,这取决于系统配置。在应用程序中运行此ATTRIB或类似命令,您将看到
我想你在IIS下运行一些网站。这种方式通常是为系统中几乎没有权限防止安全中断的最低级别用户配置的。通常是每个人或NT的权威。正如我所看到的,这个特殊的访问权限没有读取您的文件的权限
NT权限\系统:读取\数据/…:拒绝
当然,您有两个不同的答案-FALSE:运行应用程序所使用的ID的用户无法读取此文件,TRUE:文件实际存在
更改应用程序的运行ID,或授予每个人对此特定文件(包括其路径中的所有目录)的读取权限,您将在这两种检查不同含义的方法中得到相同的结果 这是一个音频文件。您如何构建
路径
?我在问题中添加了输出。您能否演示如何初始化路径
变量?以及第一个问题?(“你是如何构建路径的?”)谢谢,我想你是对的,但我不是从阅读Javadoc中得到的,他们都说如果存在安全管理器,他们会检查其SecurityManager.checkRead(java.lang.String)方法进行文件访问,但真的不清楚一个忽略读取访问,另一个不忽略。(顺便说一句,你的Javadoc链接是错误的)。我不是在运行一个网站,它是一个Swing java应用程序。我不明白的是,如果我以管理员的身份运行,除了管理员的权限之外,我还没有普通用户的权限。在你的应用程序中运行命令(Runtime.exec)来确定你是谁(whoami)并查看哪个用户用于运行你的应用程序。这是我所能看到的唯一可能的解释。(顺便说一句,我的链接是正确的文件是文件,文件是文件)我不知道Windows上有谁可以使用它-谢谢。但我知道用户我不知道的是,应用程序是否可以“以管理员身份运行”,即是否有其他管理员权限。我再次检查了您的Javadoc链接,但它们似乎仍然是错误的。当我读到这篇文章时,我认为这意味着它没有由于网络问题,我无法访问,但我认为你是对的。但我不认为这是一种改进
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
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() + "**");
}
}
}