# 用 Java 递归删除目录

> 原文： [https://howtodoinjava.com/java/io/delete-a-directory-with-all-files-inside-it/](https://howtodoinjava.com/java/io/delete-a-directory-with-all-files-inside-it/)

如果您正在使用 Java swing 应用程序/桌面应用程序，则有时可能需要从文件系统中删除其中包含所有内部目录和文件的目录。 您可以在下面的代码示例中直接删除目录以及目录中所有包含文件的目录。

它分两步递归工作：

1.  首先删除目录中的所有文件。 然后
2.  它删除目录本身

## 使用 `java.nio.file.Files`（Java 7）

下面的代码示例使用 [**`Files.walkFileTree()`**](https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#walkFileTree%28java.nio.file.Path,%20java.nio.file.FileVisitor%29 "Files.walkFileTree() method") 方法和 [**`SimpleFileVisitor`**](https://docs.oracle.com/javase/7/docs/api/java/nio/file/SimpleFileVisitor.html "SimpleFileVisitor") 执行删除操作。

```java
package example;

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;

public class DeleteDirectoryNIO 
{
	public static void main(String[] args) 
	{
		Path dir = Paths.get("c:/temp/innerDir");
		try 
		{
			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;
			          }
				   }

				});
		} 
		catch (IOException e) 
		{
		  e.printStackTrace();
		}
	}
}

Output:

Deleting file: c:\temp\innerDir\data.txt
Deleting file: c:\temp\innerDir\logging.log
Deleting file: c:\temp\innerDir\test.png
Deleting file: c:\temp\innerDir\test.txt
Deleting dir: c:\temp\innerDir

```

## 使用 `java.nio.file.Files`（Java 8）

从 Java 8 开始，您可以将 Java NIO 操作与 Java 流结合使用，上述方法变得非常简洁。

```java
public class DeleteDirectoryNIOWithStream 
{
	public static void main(String[] args) 
	{
		Path dir = Paths.get("c:/temp/innerDir");

		Files.walk(dir)
      		.sorted(Comparator.reverseOrder())
      		.map(Path::toFile)
      		.forEach(File::delete);
	}
}

```

在这里，`Files.walk()`返回表示目录本身之前目录（即文件）内容的路径流。 此后，它将`Path`映射到`File`并删除每个文件。 现在，您可以使用`delete()`方法删除文件本身。

## 使用 commons-io

Apache commons IO 模块具有类[`FileUtils`](https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html)。 可以使用`deleteDirectory(file)`方法删除目录以及其中的所有子目录和文件。

```java
import org.apache.commons.io.FileUtils;
import java.io.File;

public class DeleteDirectoryCommonsIO 
{
	public static void main(String[] args) 
	{
		File file = FileUtils.getFile("c:/temp/innerDir");

		FileUtils.deleteDirectory( file );
	}
}

```

每当您要**删除目录和其中的所有文件**时，请使用以上方便的代码示例。

学习愉快！