Хочу написать пару десятков строк кода для пересчета папок и файлов, но столкнулся с такой проблемой: не срабатывает блок if(BasicFileAttributes.isSymbolicLink()) при нахождении на симлинк. Вместо этого обрабатывается блок if(BasicFileAttributes.isDirectory()) и всё зацикливается если симлинк указывает на папку которая уже обработана.
Вопрос: как правильно организовать обработку символьных ссылок?
public class Main {
static long dirsCount = 0;
static long filesCount = 0;
public static void main(String[] args) throws IOException {
File root = new File("/");
showFiles(root);
System.out.println("Dirs: " + dirsCount);
System.out.println("Files: " + filesCount);
}
public static void showFiles(File parent) throws IOException {
File[] chieldFiles = parent.listFiles();
for (File chield : chieldFiles){
Path path = Paths.get(chield.toURI());
BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);
try {
if (attr.isSymbolicLink()) {
System.out.println(chield.getAbsolutePath());
} else if (attr.isDirectory()) {
System.out.println(chield.getAbsolutePath());
dirsCount++;
showFiles(chield);
} else {
System.out.println(chield.getAbsolutePath());
filesCount++;
}
}catch (Exception e){
}
}
}
}
Вам надо добавить третий параметр LinkOption.NOFOLLOW_LINKS в вызов функции Files.readAttributes() иначе все symlink возвращаются разрезолвленые, т.е. возвращаются конкретные объекты файловой системы.
BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS)
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники