簡體   English   中英

Java刪除文件/目錄,等同於linux“ rm -rf / tmp / garbagedir *”

[英]Java delete file/directory equivalent of linux “rm -rf /tmp/garbagedir*”

給定一堆tmp目錄和tmp文件,如下所示:

/tmp/garbagedir1/
/tmp/garbagedir2/
/tmp/garbagedir3/
/tmp/deleteme.txt
/tmp/deleteme.log

在Linux中,我們可以執行一個簡單的shell命令來遞歸地強制刪除所有這些命令:

$ rm -rf /tmp/garbagedir* /tmp/deleteme*

以上所有文件和目錄均被刪除,包括目錄中可能存在的所有文件。 / tmp目錄中的所有其他文件均未觸及。

在Java中有很多方法可以做到這一點,但是最簡單的方法又不涉及很多Java樣式樣板代碼,卻仍然是平台無關的?

您可以使用Apache Commons IO的FileUtils類; 使用它,您可以執行以下操作:

FileUtils.forceDelete(new File("/home/test"));

指向文檔的鏈接: http : //commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html

希望能幫助到你

安傑洛

請注意,我尚未測試此代碼,因此請不要在任何重要的東西上先嘗試!

您可以使用Java NIO2 SimpleFileVisitor遞歸地遍歷目錄及其子目錄。 首先,我們創建一個新的FileVisitor,它將刪除它看到的所有文件,然后在刪除所有子目錄后刪除空目錄。

  FileVisitor recursiveDeleteVisitor = new SimpleFileVisitor<Path>() {

  @Override
  public FileVisitResult visitFile(Path file,
          BasicFileAttributes attrs) throws IOException {

      System.out.println("Deleting file: " + file);
      Files.delete(file);
      return CONTINUE;
  }

  @Override
  public FileVisitResult postVisitDirectory(Path dir,
          IOException exc) throws IOException {

      System.out.println("Deleting dir: " + dir);
      if (exc == null) {
          Files.delete(dir);
          return CONTINUE;
      } else {
          throw exc;
      }
  }

 };

這可能算作樣板,但是您只需要編寫一次FileVisitor實例,然后就可以將其作為實用程序類的一部分重新使用。 我不確定為什么JDK中不包含這樣的內容。

無論如何,一旦有了它,然后遍歷/tmp並遞歸刪除任何匹配的目錄:

 File root = new File("/tmp");
 for(File child : root.listFiles()){
      //optionally use Pattern class for regex
      if(child.getName().startsWith("garbagedir")){
          Files.walkFileTree(child.toPath(), recursiveDeleteVisitor);
      }
 }

編輯


用戶fge指出Java 7有一個Files.newDirectoryStream()方法,該方法將返回一個DirectoryStream對象,該對象可用於遍歷子對象,而不是使用舊的File.listFiles()返回一個數組,這意味着所有對象都是在迭代之前在內存中創建。 如果您有很多文件,這可以使您免於內存問題。 您甚至可以將通配符模式用作第二個String參數。

Path root = Paths.get("/tmp");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(root, "garbagedir*")) {
   for (Path entry: stream) {
       Files.walkFileTree(child.toPath(), recursiveDeleteVisitor);
    }
 }

新的文件API具有您需要的所有工具:

請隨意挽救遞歸刪除示例,並注意可以進行改進。 特別是,此操作將在第一個刪除錯誤時停止,但是修改很簡單,因此在這種情況下可以繼續操作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM