2011-10-29 176 views
1

對於我正在嘗試創建目錄樹的程序。因此,我的計劃的第一部分使用路徑遍歷我需要的目錄:創建目錄樹

public static void main(String[] args) throws IOException { 
    Path startingDir = Paths.get("/home/somedirectory"); 
    PrintFiles pf = new PrintFiles(); 
    Files.walkFileTree(startingDir, pf); 

} 

而且PrintFiles程序(我直接從如何使用路徑,走了樹導向複製本)http://download.oracle.com/javase/tutorial/essential/io/walk.html

public static class PrintFiles extends SimpleFileVisitor<Path> { 

    //Print information about each type of file. 
    @Override 
    public FileVisitResult visitFile(Path file, BasicFileAttributes attr) { 
     if (attr.isSymbolicLink()) { 
      System.out.format("Symbolic link: %s ", file); 
     } else if (attr.isRegularFile()) { 
      System.out.format("Regular file: %s ", file); 
     } else { 
      System.out.format("Other: %s ", file); 
     } 
     System.out.println("(" + attr.size() + "bytes)"); 
     return CONTINUE; 
    } 

//Print each directory visited. 
    @Override 
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) { 
     System.out.format("Directory: %s%n", dir); 
     return CONTINUE; 
    } 

    public FileVisitResult visitFileFailed(Path file, IOException exc) { 
     System.err.println(exc); 
     return CONTINUE; 
    } 

}

我也有一個通用的樹程序與任意數量的節點創建一個樹,具有典型的節點添加刪除節點等功能(我沒有要發佈的代碼,因爲它的長,我因爲它不認爲它真的有必要這是一個非常標準的實現)。

我的問題是,我該如何做一些事情,我可以創建一個通用樹來表示我的特定目錄的目錄樹?我不完全熟悉路徑和文件庫的工作方式。

感謝, 凱文

+1

我會考慮使用Apache公用程序io fileutils來運行目錄 – jayunit100

回答

0

您需要實現preVisitDirectory, postVisitDirectory and visitFile。你需要在你的訪問實現中保留「當前節點」。

  • 在預先創建一個新的節點,將其添加到currentNode然後設置currentNode = newNode
  • 在visitFile創建一個新的葉子節點,並把它添加到currentNode
  • 在崗位設置currentNode = currentNode.getParent()

所以有點像堆棧操作,你在preVisit中「推」,在postVisit中「彈出」。

+0

我明白這個算法是如何工作的,但我究竟該如何控制何時調用這些函數?例如,整個遍歷在walkFileTree函數內完成,那麼我是否需要自己實現這個? – Matt

+0

您只需要實現FileVistor接口並將該實現傳遞給walkFileTree函數。它在適當的地點行走並打電話給您的訪客課程。 –