我想删除ABC目录下的所有文件。

当我尝试FileUtils.deleteDirectory(新文件(“C:/test/ABC/”));它还会删除文件夹ABC。

是否有一个一行解决方案,我可以删除目录内的文件,但不是目录?


当前回答

或者在Java 8中使用这个:

try {
  Files.newDirectoryStream( directory ).forEach( file -> {
    try { Files.delete( file ); }
    catch ( IOException e ) { throw new UncheckedIOException(e); }
  } );
}
catch ( IOException e ) {
  e.printStackTrace();
}

很遗憾异常处理是如此庞大,否则它将是一行程序…

其他回答

要删除目录中的所有文件,请输入“C:\Example”

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();
    }
}
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");
} }  }}

另一个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);
    }
}

每个流解决方案都涉及文件的问题。walk或Files.delete这些方法会抛出IOException,这在流中处理起来很麻烦。

我试图创造一个更简洁的解决方案。

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()方法。

Java 8流

这只会从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