通过jdk1.7的Files.walkFileTree实现遍历文件树的原理实现,删除文件夹下所有的文件,先把文件删除再把上级文件夹删除。
实现代码:
package xxx.nio;
import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.EnumSet;
/**
* jdk1.7 nio File工具类
*
* @author 许畅
* @since JDK1.7
* @version 2019年4月17日 许畅 新建
*/
public final class FileUtil {
/**
* 构造方法
*/
private FileUtil() {
}
/**
* 删除目标文件夹获取文件
*
* @param target 目标文件或者目标
* @throws IOException IOException
*/
public static void delete(Path target) throws IOException {
if (Files.isDirectory(target)) {
Files.walkFileTree(target, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
new DeleteDirectoryVisitor());
} else {
Files.delete(target);
}
}
}
package xxx.nio;
import java.io.IOException;
import java.nio.file.AccessDeniedException;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.StandardCopyOption;
import java.nio.file.attribute.BasicFileAttributes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 文件夹复制
*
* @author 许畅
* @since JDK1.7
* @version 2017年10月13日 许畅 新建
*/
public class CopyDirectoryVisitor extends SimpleFileVisitor {
/** 日志 */
private static final Logger LOGGER = LoggerFactory.getLogger(CopyDirectoryVisitor.class);
/** 源文件 */
private Path source;
/** 目标文件 */
private Path target;
/**
* 构造方法
*
* @param source 源文件
* @param target 目标文件
*/
public CopyDirectoryVisitor(Path source, Path target) {
this.source = source;
this.target = target;
}
/**
* 访问文件
*
* @param file 文件路径
* @param attributes 属性
* @return FileVisitResult
* @throws IOException IO异常
*/
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) throws IOException {
LOGGER.info("Copying " + source.relativize(file));
Files.copy(file, target.resolve(source.relativize(file)), StandardCopyOption.REPLACE_EXISTING);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path directory, BasicFileAttributes attributes) throws IOException {
Path targetDirectory = target.resolve(source.relativize(directory));
try {
LOGGER.info("Copying " + source.relativize(directory));
Files.copy(directory, targetDirectory, StandardCopyOption.REPLACE_EXISTING);
} catch (FileAlreadyExistsException e) {
if (!Files.isDirectory(targetDirectory)) {
throw e;
}
} catch (DirectoryNotEmptyException e) {
// ignore
} catch (AccessDeniedException e) {
// ignore
}
return FileVisitResult.CONTINUE;
}
}