Java Files和Paths实现文件夹的递归移动,删除

需求

将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();
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值