在Java中递归地删除一个目录及其所有子目录和文件的具体操作及完整代码示例

444 阅读1分钟

如何在Java中递归地删除一个目录及其所有子目录和文件

How to delete a directory recursively with all its subdirectories and files in Java

在这篇短文中,你将学习如何递归地删除一个目录及其所有子目录和文件。

有两个例子演示了如何实现这一任务。这两个例子背后的想法是遍历文件树,并在删除目录本身之前删除任何目录中的文件。

递归删除目录 - Java 8+

这个例子使用了 Files.walk(Path)方法,通过以深度优先的方式行走文件树,返回一个由Path对象填充的Stream<Path>

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Comparator;

public class DeleteDirectoryRecursively {
    public static void main(String[] args) throws IOException {
        Path dir = Paths.get("java");

        // Traverse the file tree in depth-first fashion and delete each file/directory.
        Files.walk(dir)
                .sorted(Comparator.reverseOrder())
                .forEach(path -> {
                    try {
                        System.out.println("Deleting: " + path);
                        Files.delete(path);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });
    }
}

递归删除目录 - Java 7

下面的例子使用了 Files.walkFileTree(Path, FileVisitor)方法来遍历文件树并为每个文件调用所提供的FileVisitor

我们使用一个 SimpleFileVisitor来执行删除操作。

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class DeleteDirectoryRecursively1 {
    public static void main(String[] args) throws IOException {
        Path dir = Paths.get("java");

        // Traverse the file tree and delete each file/directory.
        Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                System.out.println("Deleting file: " + file);
                Files.delete(file);
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
                System.out.println("Deleting dir: " + dir);
                if (exc == null) {
                    Files.delete(dir);
                    return FileVisitResult.CONTINUE;
                } else {
                    throw exc;
                }
            }
        });
    }
}