gpt4 book ai didi

java - Files.exists(path) 和 path.toFile().exists() 对同一个文件给出不同的结果

转载 作者:搜寻专家 更新时间:2023-10-30 20:00:37 26 4
gpt4 key购买 nike

对于 Windows 上的本地文件,我得到的 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 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 应用程序也获得了管理员权限。

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

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() + "**");
}
}
}

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

Owner: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:ALLOW BUILTIN\Administrators:WRITE_DATA/APPEND_DATA/WRITE_NAMED_ATTRS/WRITE_ATTRIBUTES/SYNCHRONIZE:ALLOW

如您所见,即使 Administrators 没有 READREAD PERMISSIONS 选项,他们也可以输出权限,而之前他们不能,可能是由于 BUILTIN/Administraor 被归还为所有者。

最佳答案

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

它指出,Files.exists(path) 返回 false 并不意味着它不存在,所以是的,它似乎存在权限问题。也试试 Files.notExists(path) 看看它返回什么。如果为false则表示无法判断文件是否存在,如果返回true则可能是你的代码有问题。

尝试从命令行而不是 netbeans 运行您的文件。如果您不知道如何执行此操作,您可以只搜索谷歌,这方面有很多东西,但基本上您想要做的是用 javac myfile.java 编译 .java 文件然后用 java myfile 运行它。使用普通的命令提示符和以管理员身份打开的命令提示符执行此操作,看看会得到什么。

关于java - Files.exists(path) 和 path.toFile().exists() 对同一个文件给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35087699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com