我的方法:使用递归将文件夹中的文件逐个移动到目标的文件中。
import java.io.File;
import java.io.IOException;
import java.nio.file.*;
public class DeleteChildFiles {
public static void main(String[] args) {
new DeleteChildFiles().moveToParentPath("父目录路径");
}
public Boolean moveToParentPath(String path) {
Path path1 = Paths.get(path);
//判断文件夹是否存在且为文件目录
if (Files.exists(path1, LinkOption.NOFOLLOW_LINKS) && Files.isDirectory(path1, LinkOption.NOFOLLOW_LINKS)) {
File file = new File(path);
File[] files = file.listFiles();
Path path2 = files[0].toPath();
//是否只有一个文件,并且是文件夹
if (files.length == 1 && Files.isDirectory(path2, LinkOption.NOFOLLOW_LINKS)) {
//调用方法
moveFile(path2.toString(),path1.toString());
//删除子目录
files[0].delete();
}
}
return true;
}
/**
* 移动文件
*
* @param pathSource
* @param pathDir
*/
private void moveFile(String pathSource, String pathDir) {
File fileSour = new File(pathSource);
File[] fileArray = fileSour.listFiles();
if (fileArray != null) {
for (File file : fileArray)
if (file != null && file.exists()) {
if (file.isDirectory()) {
//默认目标文件中不存在名字相同的目录
File newDir = new File(pathDir, file.getName());
if (!newDir.exists()){
newDir.mkdirs();
}
moveFile(file.getAbsolutePath(), newDir.getAbsolutePath());
try {
Files.deleteIfExists(file.toPath());
} catch (IOException e) {
e.printStackTrace();
}
} else {
//复制
File targetFile = new File(pathDir, file.getName());
//删除重名文件,renameTo不会覆盖同名文件
if (targetFile.exists()) {
targetFile.delete();
}
file.renameTo(targetFile);
file.delete();
}
}
}else {
System.out.println("文件不存在");
}
}
}
别人的方法:关于nio:Java将具有文件和结构的子目录移动到父目录 | 码农家园 (codenong.com)
首先需要有一个类,类的作用大概是防止直接使用move方法报错。
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Objects;
import static java.nio.file.FileVisitResult.TERMINATE;
public class MoveFileVisitor implements FileVisitor<Path> {
private final Path target;
private final Path source;
public MoveFileVisitor(Path source, Path target) {
this.target = Objects.requireNonNull(target);
this.source = Objects.requireNonNull(source);
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
Path relativePath = source.relativize(dir);//调用源文件的路径获取源文件夹的其他文件的相对路径的,不用“./”表示吧
Path finalPath = target.resolve(relativePath);//相当于将文件名拼接到target的路径后
Files.createDirectories(finalPath);//创建文件夹
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Path relativePath = source.relativize(file);
Path finalLocation = target.resolve(relativePath);
Files.move(file, finalLocation);//文件移动
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
System.out.println("Failed to visit file during move" + file.toAbsolutePath()+ exc);
return TERMINATE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
Files.delete(dir);//文件夹删除
return FileVisitResult.CONTINUE;
}
}
以上方法的作用:
preVisitDirectory:访问到文件夹的时候,可以在这个方法中对这个文件夹进行处理visitFile:访问到文件的时候调用visitFileFailed:访问文件或文件夹的时候,失败时使用postVisitDirectory:访问文件后处理FileVisitResult.CONTINUE:CONTINUE表示继续遍历文件FileVisitResult.TERMINATE:终止操作 找到之后不再处理了
这个类类似于深度遍历,先遍历了一个文件夹以及文件中的其他文件,再遍历其他文件夹。
再建一个方法用于调用这个类
import java.io.File;
import java.io.IOException;
import java.nio.file.*;
public class DeleteChildFiles {
public static void main(String[] args) {
new DeleteChildFiles().moveToParentPath("父目录路径");
}
public void moveToParentPath(String path) {
Path path1 = Paths.get(path);
//判断文件夹是否存在且为文件目录
if (Files.exists(path1, LinkOption.NOFOLLOW_LINKS) && Files.isDirectory(path1, LinkOption.NOFOLLOW_LINKS)) {
File file = new File(path);
File[] files = file.listFiles();
//是否只有一个文件,并且是文件夹
Path path2 = files[0].toPath();
if (files.length == 1 && Files.isDirectory(path2, LinkOption.NOFOLLOW_LINKS)) {
MoveFileVisitor moveFileVisitor = new MoveFileVisitor(path2, path1);
try {
Files.walkFileTree(path2, moveFileVisitor);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}}
总结:我不适合干这一行!!!