#java #java.nio.file
#java #java.nio.file
Вопрос:
Я пытаюсь использовать метод FileWalkTree() в JDK 7 (java.nio.file) . Для реализации моего собственного FileVisitor я создал класс CustomFileVIsitor путем расширения SimpleFileVisitor.
В этом классе CustomFileVIsitor …. Я переопределяю функцию visitFile
public FileVisitResult visitFile(Path file, BasicFileAttributes fileStats)
throws IOException {
System.out.println("ttChecking Symbolic Link " Files.isSymbolicLink(file));
System.out.println("ttChecking Symbolic Link " fileStats.isSymbolicLink());
System.out.println("ttFile Size " Files.size(file));
System.out.println("ttFile Size " fileStats.size());
//Rest of the code
}
Теперь, чтобы протестировать этот код, я создал папку, а затем добавил в нее файл и символическую ссылку (на файл).
Когда я выполняю класс с FileWalkTree, выходные данные, генерируемые Files.isSymbolicLink(файл) и fileStats.isSymbolicLink() для символической ссылки, отличаются
Результат выглядит следующим образом:
Checking Symbolic Link true
Checking Symbolic Link false
File Size 38
File Size 38
Почему это так? Это ошибка или я чего-то не понимаю в интерпретации информации?
Ответ №1:
Я предполагаю, что вы получаете атрибуты файла с помощью вызова, подобного
FileAttributes attrs = Files.readAttributes(path, FileAttributes.class);
если это так, вам, вероятно, нужно предотвратить разрешение символьной ссылки, передав соответствующее LinkOption
перечисление, вот так
FileAttributes attrs = Files.readAttributes(path, FileAttributes.class, NOFOLLOW_LINKS);
Скорее всего, вы разрешили получение вашей ссылки FileAttributes
, что объясняет, почему File
сообщает, что это символическая ссылка, в то время как FileAttributes
сообщает, что это не символическая ссылка.
Комментарии:
1. Большое спасибо … Вы правы, мой первоначальный код был,
Files.walkFileTree(toolVersionPath, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,preScanVisitorObject);
и теперь я изменил наFiles.walkFileTree(toolVersionPath, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE,preScanVisitorObject);
, и теперь он возвращает, что файл является символической ссылкой в обоих случаях…….