/usr/local 和我的 Java 程序无法识别子文件夹

/usr/local and subfolders are not recognized by my Java program

我有一个 64 位 Linux Mint 20.1 OS,我意识到我的任意 Java 程序无法识别“/usr/local”或其中的任何内容作为现有实体。为了阐明我的意思,我在下面举了几个例子:

System.out.println(new File("/usr").exists()); //prints true

System.out.println(new File("/usr/local").exists()); //prints false

System.out.println(new File("/usr/local/bin").exists()); //prints false

System.out.println(new File("/usr/local/random-file-1").exists()); 
//prints false, regardless of whether that file exists

我检查了 /usr/local 的权限,假设那里可能有问题,但奇怪的是,我没有发现任何问题:

你能给梨形造型的两分钱吗?

与 java 无关,与您的 linux 安装有关:

选项 1:此目录没有 Unix UGO x 权限。

该进程无法查看 /usr 目录。最有可能的是,进程 运行 作为用户 X,在组 [Y] 中(可以是多个!)。

/usr 目录肯定不属于 X(在所有相关的 unix 发行版上,它属于 root)。 /usr 的群组所有者也可能是 [Y] 集合中的任何内容;在大多数 linuxen 上,它是组 root,除了 root 本身,没有用户属于该组。

因此,访问权限的最后 3 个字母适用(即 user/group/others)。因此,运行 ls -lah / 并检查 /usr 的访问权限。我预计:

drwxr-xr--  10 root root 4.0K Jan 1   2021 usr

注意最后是r--。 no x 意味着没有权利查看它。那可以解释你所看到的。

请注意 这与 /usr/local! 的访问权限无关 要阅读目录,您需要访问整个 'stack',并且在一般来说,阻止你的目录本身仍然对你可见 - 只是你不能删除或移动它,不能 运行 或打开其中的任何东西,甚至不能 ls 它。因此,你甚至不能 'see' /usr/local 的事实表明,如果它是 UGO 访问,它不是 /usr/local,而是 /usr/ .

选项 2:ACL 覆盖权限

一些发行版(特别是 mac OS X)在标准 unixy user/group + UGO 权限系统之上添加了一层访问权限。例如,在mac OS 中,您需要进入系统首选项面板并进入'privacy',并在此处添加一些磁盘访问权限。我不确定 mint 是否有类似的系统。可能不是,特别是对于 /usr 这是一个相当重要的问题。

选项 3:奇怪的东西

您使用的是不应该再使用的过时 java API。这个 API 的缺点之一是它不能给你关于东西的信息,它只能 return 布尔值。所以,尝试使用新的 API,如果出现错误,因为如果这样做,它会帮助 很多 更多:它会有很多文本给你解释一下:

(首先检查 /usr/bin/man 是否存在;它应该存在。如果不存在,请选择您在那里找到的任何其他现有内容)。

import java.nio.file.*;

class Test {
    public static void main(String[] args) throws Exception {
        Path p = Paths.get("/usr/bin/man"); // I assume this exists.
        byte[] b = Files.readAllBytes(p);
        System.out.println("size of man exe: " + b.length);
    }
}

这会抛出一些东西(或者如果它没有抛出,嘿,其他地方出了问题,因为这个测试应用没有问题!)- 该异常的文本会告诉你一些有用的东西。

选项 4:嗯

您的磁盘已损坏。希望不是这样吧:P