我想删除ABC目录内的所有文件。
当我尝试使用 FileUtils.deleteDirectory(new File("C:/test/ABC/"));
时,它也会删除ABC文件夹。
有没有一行代码的解决方案可以只删除目录内的文件,而不删除目录本身?
我想删除ABC目录内的所有文件。
当我尝试使用 FileUtils.deleteDirectory(new File("C:/test/ABC/"));
时,它也会删除ABC文件夹。
有没有一行代码的解决方案可以只删除目录内的文件,而不删除目录本身?
import org.apache.commons.io.FileUtils;
FileUtils.cleanDirectory(directory);
在同一个文件中,有这个方法可用。它会递归删除所有子文件夹和文件。
rm -rf directory
比使用 FileUtils.cleanDirectory
更有效率。 - Joshua Pinter你的意思是这样吗?
for(File file: dir.listFiles())
if (!file.isDirectory())
file.delete();
这将仅删除文件,而不是目录。
for(File file: dir.listFiles())
可能是指... for (File file : new java.io.File("C:\\DeleteMeFolder").listFiles())
... - Hartmut PfarrPeter 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()
方法。
这仅会从ABC中删除文件(子目录不变):
Arrays.stream(new File("C:/test/ABC/").listFiles()).forEach(File::delete);
这将仅删除来自ABC(及其子目录)的文件:
Files.walk(Paths.get("C:/test/ABC/"))
.filter(Files::isRegularFile)
.map(Path::toFile)
.forEach(File::delete);
^ 这个版本需要处理 IOException 异常
或者在Java 8中使用:
try {
Files.newDirectoryStream( directory ).forEach( file -> {
try { Files.delete( file ); }
catch ( IOException e ) { throw new UncheckedIOException(e); }
} );
}
catch ( IOException e ) {
e.printStackTrace();
}
遗憾的是异常处理太笨重了,否则它本可以只有一行代码。
rm -rf
比FileUtils.cleanDirectory
更高效。虽然不是一行代码的解决方案,但在广泛的基准测试后,我们发现使用rm -rf
比使用FileUtils.cleanDirectory
快多倍.
当然,如果您的目录很小或简单,则无关紧要,但在我们的情况下,我们有多个千兆字节和深度嵌套的子目录,使用FileUtils.cleanDirectory
需要超过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");
} } }}
File file = new File("C:\\Example");
String[] myFiles;
if (file.isDirectory()) {
myFiles = file.list();
for (int i = 0; i < myFiles.length; i++) {
File myFile = new File(file, myFiles[i]);
myFile.delete();
}
}
以下是使用Java 8 Stream删除文件夹中所有内容(包括子目录,但不包括文件夹本身)的另一种解决方案:
用法:
Path folder = Paths.get("/tmp/folder");
CleanFolder.clean(folder);
以及代码:
public interface CleanFolder {
static void clean(Path folder) throws IOException {
Function<Path, Stream<Path>> walk = p -> {
try { return Files.walk(p);
} catch (IOException e) {
return Stream.empty();
}};
Consumer<Path> delete = p -> {
try {
Files.delete(p);
} catch (IOException e) {
}
};
Files.list(folder)
.flatMap(walk)
.sorted(Comparator.reverseOrder())
.forEach(delete);
}
}
Files.walk(Paths.get("C:/test/ABC/"))
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.filter(item -> !item.getPath().equals("C:/test/ABC/"))
.forEach(File::delete);
Cheers!
rm -rf directory; mkdir directory
比使用FileUtils.cleanDirectory
更快。 - Joshua Pinter