通過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<Path> {
/** 日誌 */
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;
}
}