2012-05-01 41 views
3

我需要對目錄中最後訪問的文件執行一些操作。我如何知道當前撥打我的visitFile()是否是最後一次?如何知道在FileVisitor中訪問最後一個文件的時間?

(我只是想列出所有在指定目錄中的文件和目錄。要做到這一點,我已經介紹了depth場我FileVisitor執行,並在preVisitDirectory我回到SKIP_SUBTREE如果深度大於0。 (然後遞增depth。)問題是,我不知道何時將depth重置爲0,因爲當我將此FileVisitor實現調用walkFileTree用於其他目錄時,depth已經> 0,並且它僅列出給定目錄)。

+1

「目錄中的最後一個文件」,如按升序排列的名字嗎?降序?上一次更改?我不認爲他們是以任何特定的順序列出的... – Puce

+0

沒錯,它看起來像文件被訪問的名字升序,我不知道如何我可以改變,如果我想。但是,訂單並不重要。我只想知道「何時」是最後一次調用'visitFile()'(即類似於'if(!hasMoreFilesToVisit())')的東西,而不管訪問順序如何。 (或者,如果在'_walkFileTree_'返回之前調用_just_方法可以擴展..)無論如何,你說的「目錄中的最後一個文件」是錯誤的。將其編輯爲「在目錄中最後訪問的文件」。 – Bloke

回答

4

如何維持深度只有在兩種方法中,preVisitDirectorypostVisitDirectory?您將在preVisitDirectory中增加depth,並將其遞減至postVisitDirectory。您可能必須初始化depth-1,但在啓動目錄中有depth == 0。這樣,你總是會有正確的depth

編輯:如果你從visitFile返回SKIP_SIBLINGS,而不是從preVisitDirectorypostVisitDirectory仍然會被調用!

下面是一個代碼示例:

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

'preVisitDirectory'返回'SKIP_SUBTREE',這意味着將不會訪問裏面的其他目錄,因此'postVisitDirectory'方法將不會被調用,因此''postVisitDirectory'僅對給定目錄(當'depth == 0')時被調用。 **但是**,你的回答讓我意識到目錄是「作爲文件訪問」的,即在'visitFile'中,我可以檢查文件是否是目錄,如果是,則減小'depth'。所以這解決了我的問題,謝謝。 – Bloke

+0

另外,每當'depth> 0'時,你可以從'visitFile'返回'SKIP_SIBLINGS' ... – rrufai

相關問題