2013-01-10 73 views
4

我正在嘗試遍歷文件樹並刪除所有文件/目錄。該代碼是下面:Java nio - 無法刪除已被清空的目錄

 Files.walkFileTree(metricPath, new SimpleFileVisitor<Path>() { 

      @Override 
      public FileVisitResult visitFile(Path file, 
              BasicFileAttributes attrs) throws IOException { 
       Files.delete(file); 
       return FileVisitResult.CONTINUE; 
      } 

      @Override 
      public FileVisitResult postVisitDirectory(Path dir, 
                 IOException exc) throws IOException { 
       if (exc == null) { 
        Files.delete(dir); 
        return FileVisitResult.CONTINUE; 
       } else { 
        throw exc; 
       } 
      } 
     }); 
    } 

此代碼單元測試,其中的每一個生成一個單獨的文件,在形式folder1/folder2/file之間運行英寸當我嘗試走樹時,DirectoryNotEmptyException引發folder1試圖刪除時,雖然它顯然是空的...

+0

的【刪除的文件遞歸的Java(HTTP可能重複://計算器.com/questions/779519/delete-files-recursively-in-java) – jlordo

+0

其實,其他問題是當你有一個文件。在這種情況下,代碼是爲Path執行的,並且不一定能夠將Path轉換爲文件,因此Commons IO的FileUtils將不起作用。 – Trejkaz

回答

0

你檢查該隱藏文件的目錄?在Windows上,可能有一些進程打開了這個目錄,並且打開文件HANDLE仍然存在於系統HANDLE表中。在這種情況下,目錄被鎖定,java可能拋出異常。

+0

基本上,當調用folder1的postVisit時,folder2的postVisit仍然存在。看起來像Java bug ... – Bober02

+0

我懷疑它是長期居住在JRE源頭上的jave bug。我很久以前就必須解決。你能否再次解釋一下你剛剛說的'postVisit for folder1仍然存在bla bla bla'。什麼是postVisit? – Archer

+0

對於folder1 postVisitDirectory方法失敗,因爲其中有folder2 ......我不知道爲什麼在調用folder1之前調用folder1的postVisit方法... – Bober02

-1

或者,您可以導入Apache Commons IO並使用其FileUtils.deleteDirectory(File directory)方法。只有一條線路是足夠的,因爲它會刪除所有文件和子目錄遞歸:

FileUtils.deleteDirectory(dirToBeDeleted); 
+2

正確但不回答問題。 – EJP

+0

已確認。但是,它爲潛在問題提供了一個簡單的解決方案,可能會引起人們的興趣。 – matsev

0

,我可以看到它在你的代碼,不應該有一個問題,而不是除非文件/文件夾是隻讀模式。您可能希望在刪除之前先探索更改文件權限。

可你也嘗試把Files.delete()方法對以下重寫

public FileVisitResult visitFileFailed(Path file, IOException exc)

參考: JAVA NIO Directory Delete