Поведение JDK 7 java.nio.file isSymbolicLink()

#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); , и теперь он возвращает, что файл является символической ссылкой в обоих случаях…….