![](/img/trans.png)
[英]Deleting remote files is better with file.delete() or making ProcessBuilder call with rm -rf?
[英]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具有您需要的所有工具:
FileVisitor
界面,可用於執行遞歸文件刪除(請參閱此處的示例)。 請隨意挽救遞歸刪除示例,並注意可以進行改進。 特別是,此操作將在第一個刪除錯誤時停止,但是修改很簡單,因此在這種情況下可以繼續操作 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.