需求
将source(C:\Users\lelecao\Desktop\source)整个目录移动到target(C:\Users\lelecao\Desktop\target)目录下
source目录结构:
source目录复制后:
解决思路
先递归source文件夹,然后在遍历的同时使用Java提供的Paths类的方法,进行文件夹和文件的复制。文件夹和文件的复制相同,这里以文件为例。文件的复制需要原来文件的文件名和目标文件夹的根路径拼接,就可以调用Files.copy(target,source)方法进行复制(该方法只能复制空文件夹或文件,并且目标文件夹或者文件的路径非尾部分必须存在,也就是C:\Users\lelecao\Desktop\target必须先存在)。
详细实现
思路就是树的前序遍历
private void recursiveCopyFiles(File file, File target) throws IOException {
System.out.println(Paths.get(target.getAbsolutePath()+"\\"+file.getName()));
if (Files.notExists(Paths.get(target.getAbsolutePath()+"\\"+file.getName())))
Files.copy(Paths.get(file.getAbsolutePath()), Paths.get(target.getAbsolutePath() +"\\"+ file.getName()));
if (file.isDirectory()) {
File[] files = file.listFiles(); //获取文件夹内的列表
for (File file11 : files) {
recursiveCopyFiles(file11, new File(target + "\\"+file.getName()));
}
}
}
在递归调用的时候,需要将新的目标路径作为target参数,新的target绝对路径是target + “\”+file.getName()。另外这里仅仅进行复制,需要再用一个递归方法去删除source文件夹,删除思路是树的后序遍历。
private void recursiveDeleteFiles(String path) {
File file = new File(path);
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File file1 : files) {
recursiveDeleteFiles(file1.getAbsolutePath());
}
}
file.delete();
}
附录
代码
@Test
public void moveSQLFiles() throws IOException {
log.info(">>月度文件复制开始");
String sourcePath = "C:\\Users\\lelecao\\Desktop\\source";
String targetPath = "C:\\Users\\lelecao\\Desktop\\target";
File file = new File(sourcePath);
File target = new File(targetPath);
recursiveCopyFiles(file, target);
log.info("月度文件复制结束");
log.info("月度文件删除开始");
recursiveDeleteFiles(sourcePath);
log.info("月度文件删除结束");
}
//递归移动文件夹
//使用递归复制文件
private void recursiveCopyFiles(File file, File target) throws IOException {
System.out.println(Paths.get(target.getAbsolutePath()+"\\"+file.getName()));
if (Files.notExists(Paths.get(target.getAbsolutePath()+"\\"+file.getName())))
Files.copy(Paths.get(file.getAbsolutePath()), Paths.get(target.getAbsolutePath() +"\\"+ file.getName()));
if (file.isDirectory()) {
File[] files = file.listFiles(); //获取文件夹内的列表
for (File file11 : files) {
recursiveCopyFiles(file11, new File(target + "\\"+file.getName()));
}
}
}
private void recursiveDeleteFiles(String path) {
File file = new File(path);
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File file1 : files) {
recursiveDeleteFiles(file1.getAbsolutePath());
}
}
System.out.println(file.getAbsolutePath());
file.delete();
}