Файловый API для получения всех символических ссылок на папку - PullRequest
0 голосов
/ 18 мая 2018
Folder17
Folder18
Folder19 -> /myfolder/17
Folder20 -> /myfolder/17

У меня есть созданная символическая ссылка от Folder19 до Folder17 и Folder 20 до Folder17

. Я могу использовать Files.isSymbolicLink(path), чтобы определить, является ли файл символической ссылкой.Но есть ли другой путь?Я хотел знать все папки, связанные со мной.Например, в этом случае я хочу знать все ссылки для Folder17, которые должны дать мне Folder19 и Folder20

, которые я создал ниже, что-то вроде ниже cd / foo

mkdir b
ln -s /foo/b e
ln -s /foo/b f
ln -s /foo/b g
ls -la
    b
    e -> /foo/b
    f -> /foo/b
    g -> /foo/b

В моем классе Java, я сделал ниже. Я ожидал вернуть e, f, g с размером 3. Но размер 0

    Path path = Paths.get("/foo/b");
    Collection<Path> paths      =  Files.walk(path)
            .filter(Files::isSymbolicLink)
            .filter(p -> {
                try {
                    return path.equals(Files.readSymbolicLink(p));
                } catch (IOException e) {
                    System.out.println("log");
                    throw new RuntimeException("An I/O error has occurred!");
                }
            })
            .collect(Collectors.toList());
    System.out.println(paths.size());
}
catch(Exception e)
{
    e.printStackTrace();
}

}

1 Ответ

0 голосов
/ 18 мая 2018

Хороший вопрос.Возможно, вы поймете, почему для какого-то файла A было бы излишним отслеживать каждый файл, который символически связан с A, поскольку он потенциально может занимать много места.По этой причине было бы просто перемещаться по каталогу, проверяя наличие символических ссылок на файл A.Вы можете использовать что-то похожее на следующее:

Files.walk(path)
     .filter(Files::isSymbolicLink)
     .filter(p -> {
         try {
             return path.equals(Files.readSymbolicLink(p));
         } catch (IOException e) {
             throw new RuntimeException("An I/O error has occurred!");
         }
     })
     .collect(Collectors.toList());

Возвращает List<Path>, содержащий все Path s, которые являются символическими ссылками на path.

Примечание : Вы можете использовать Files#walkFileTree для рекурсивного поиска в этих каталогах, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...