我想删除ABC目录下的所有文件。
当我尝试FileUtils.deleteDirectory(新文件(“C:/test/ABC/”));它还会删除文件夹ABC。
是否有一个一行解决方案,我可以删除目录内的文件,但不是目录?
我想删除ABC目录下的所有文件。
当我尝试FileUtils.deleteDirectory(新文件(“C:/test/ABC/”));它还会删除文件夹ABC。
是否有一个一行解决方案,我可以删除目录内的文件,但不是目录?
当前回答
rm -rf比FileUtils.cleanDirectory的性能要好得多。
不是一行程序解决方案,但经过大量的基准测试后,我们发现使用rm -rf比使用FileUtils.cleanDirectory快几倍。
当然,如果您有一个小的或简单的目录,这没有关系,但在我们的例子中,我们有多个gb和深嵌套的子目录,使用FileUtils将花费10分钟以上的时间。使用rm -rf只需要1分钟。
下面是我们粗略的Java实现:
// Delete directory given and all subdirectories and files (i.e. recursively).
//
static public boolean clearDirectory( File file ) throws IOException, InterruptedException {
if ( file.exists() ) {
String deleteCommand = "rm -rf " + file.getAbsolutePath();
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec( deleteCommand );
process.waitFor();
file.mkdirs(); // Since we only want to clear the directory and not delete it, we need to re-create the directory.
return true;
}
return false;
}
如果您正在处理大型或复杂的目录,值得一试。
其他回答
你是说像?
for(File file: dir.listFiles())
if (!file.isDirectory())
file.delete();
这将只删除文件,而不是目录。
import org.apache.commons.io.FileUtils;
FileUtils.cleanDirectory(directory);
在同一文件中有此方法可用。这也会递归地删除它们下面的所有子文件夹和文件。
文档:org.apache.commons.io.FileUtils.cleanDirectory
rm -rf比FileUtils.cleanDirectory的性能要好得多。
不是一行程序解决方案,但经过大量的基准测试后,我们发现使用rm -rf比使用FileUtils.cleanDirectory快几倍。
当然,如果您有一个小的或简单的目录,这没有关系,但在我们的例子中,我们有多个gb和深嵌套的子目录,使用FileUtils将花费10分钟以上的时间。使用rm -rf只需要1分钟。
下面是我们粗略的Java实现:
// Delete directory given and all subdirectories and files (i.e. recursively).
//
static public boolean clearDirectory( File file ) throws IOException, InterruptedException {
if ( file.exists() ) {
String deleteCommand = "rm -rf " + file.getAbsolutePath();
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec( deleteCommand );
process.waitFor();
file.mkdirs(); // Since we only want to clear the directory and not delete it, we need to re-create the directory.
return true;
}
return false;
}
如果您正在处理大型或复杂的目录,值得一试。
public class DeleteFile {
public static void main(String[] args) {
String path="D:\test";
File file = new File(path);
File[] files = file.listFiles();
for (File f:files)
{if (f.isFile() && f.exists)
{ f.delete();
system.out.println("successfully deleted");
}else{
system.out.println("cant delete a file due to open or error");
} } }}
Peter Lawrey的回答很好,因为它很简单,不依赖于任何特殊的东西,这是你应该做的方式。如果你需要删除子目录和它们的内容,使用递归:
void purgeDirectory(File dir) {
for (File file: dir.listFiles()) {
if (file.isDirectory())
purgeDirectory(file);
file.delete();
}
}
为了节省子目录及其内容(你的问题的一部分),修改如下:
void purgeDirectoryButKeepSubDirectories(File dir) {
for (File file: dir.listFiles()) {
if (!file.isDirectory())
file.delete();
}
}
或者,既然你想要一个单行的解决方案:
for (File file: dir.listFiles())
if (!file.isDirectory())
file.delete();
使用外部库来完成如此琐碎的任务并不是一个好主意,除非您需要这个库来完成其他任务,在这种情况下,最好使用现有的代码。您似乎正在使用Apache库,因此使用它的FileUtils.cleanDirectory()方法。