2012-05-01 8 views
3

Мне нужно что-то сделать с файлом, посещенным последним в каталоге. Как я могу узнать, является ли текущий звонок моим visitFile() последним?Как узнать, когда последний файл посещается в FileVisitor?

(я только хочу, чтобы получить список всех файлов и каталогов в данном каталоге. Для этого я ввел depth поле для моей FileVisitor реализации и в preVisitDirectory я вернусь SKIP_SUBTREE, если глубина больше 0. (И затем увеличивайте значение depth.) Проблема в том, что я не знаю, когда нужно сбросить depth на 0, потому что когда я вызываю walkFileTree с этой реализацией FileVisitor для другого каталога, depth уже> 0, и он отображает только список данный каталог.)

+1

«последний файл в директории» как в имени в порядке возрастания? в порядке убывания? Последнее изменение? Я не думаю, что они перечислены в каком-то определенном порядке ... – Puce

+0

Правда, похоже, что файлы посещаются по возрастанию по имени, я не знаю, как это изменить, если бы захотел. Однако порядок не имеет значения. Мне бы только хотелось узнать, когда «когда» в последний раз вызывается 'visitFile()' (то есть что-то вроде 'if (! HasMoreFilesToVisit())') независимо от порядка посещения. (Или, если есть метод, вызываемый _just_ перед возвратом '_walkFileTree_', который может быть расширен ..) В любом случае вы правы, что« последний файл в каталоге »неверен. Редактирование его в «файл, который был посещен последним в каталоге». – Bloke

ответ

4

Как насчет сохранения глубины только в пределах двух методов, preVisitDirectory и postVisitDirectory? Вы увеличиваете depth в preVisitDirectory и уменьшаете его в postVisitDirectory. Возможно, вам придется инициализировать depth до -1, чтобы иметь depth == 0, когда в стартовом каталоге. Таким образом, вы всегда будете иметь право depth.

Edit: Если вы вернетесь SKIP_SIBLINGS из visitFile, а не из preVisitDirectory, то postVisitDirectory все равно дозвонились!

Вот пример кода:

public class Java7FileVisitorExample { 

public void traverseFolder(Path start){ 
    try { 
     Files.walkFileTree(start, new SimpleFileVisitor<Path>() { 

      private int depth = -1; 

      @Override 
      public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) 
        throws IOException { 
       System.out.println("preVisitDirectory(" + dir + ")"); 
       depth++; 
       return FileVisitResult.CONTINUE; 
      } 

      @Override 
      public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
        throws IOException { 
       if (depth > 0) { 
        return FileVisitResult.SKIP_SIBLINGS; 
       } 

       System.out.println("visitFile(" + file + ", " + attrs + "): depth == " + depth); 

       return FileVisitResult.CONTINUE; 
      } 

      @Override 
      public FileVisitResult postVisitDirectory(Path dir, IOException e) 
        throws IOException { 
       if (e == null) { 
        depth--; 
        System.out.println("postVisitDirectory(" + dir + ")"); 
        return FileVisitResult.CONTINUE; 
       } else { 
        throw e; 
       } 


      } 
     }); 
    } catch (IOException ex) { 
     Logger.getAnonymousLogger().throwing(getClass().getName(), 
       "traverseFolder", ex); 
    } 
} 

public static void main(String... args) { 
    Path start = Paths.get("/Book/Algorithm"); 
    new Java7FileVisitorExample().traverseFolder(start); 
} 

}

+0

'postVisitDirectory' вызывается только для данного каталога (когда' depth == 0'), так как 'preVisitDirectory' возвращает' SKIP_SUBTREE', что означает, что другие каталоги внутри не будут посещены, и поэтому методы postVisitDirectory не будут вызваны для них , ** Но **, ваш ответ заставил меня понять, что каталоги «посещаются как файлы», то есть в 'visitFile', я могу проверить, является ли файл каталогом и уменьшает« глубину », если это так. Поэтому, чтобы решить мою проблему, спасибо. – Bloke

+0

В качестве альтернативы вы можете вернуть 'SKIP_SIBLINGS' из' visitFile' всякий раз, когда 'depth> 0' ... – rrufai

 Смежные вопросы

  • Нет связанных вопросов^_^