美文网首页
DFS遍历拷贝所有子文件夹及目录列表 (Java版)

DFS遍历拷贝所有子文件夹及目录列表 (Java版)

作者: 山枫叶纷飞 | 来源:发表于2019-06-18 10:15 被阅读0次
    如题
    • 注意,文件夹是不能拷贝的, 需要mkdir的
    • 文件选择合适的流进行拷贝
    main测试方法
    /**
         * 主测试类,默认将D:\\base01 下的复制到D:\\base02
         * @param args
         * @throws IOException
         */
        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub
            
            String originUrl;
            String targetUrl;
            
            System.out.println("请输入源目录: "+"D:\\base01");
    //      originUrl = scanner.next();
            originUrl = "D:\\base01";
            System.out.println("请输入目标目录: "+"D:\\base02");
    //      targetUrl = scanner.next();
            targetUrl = "D:\\base02";
            
            System.out.println("正在将"+originUrl+"目录下全部文件复制到"+targetUrl+".........");
            
            //Show Time , 先遍历,再逐个复制即可1
            File beginDir = new File(originUrl); 
            File endDir = new File(targetUrl); 
            
            //获取第一层目录, 遍历, 深度优先搜索
            File[] childFileArr = beginDir.listFiles();
            dfsDir(childFileArr,originUrl,targetUrl);
            
            System.out.println("复制成功--");
        }
    
    dfs复制方法
    /**
         * dfs复制,文件夹mkdir后进入递归,文件直接拷贝
         * @param childFileArr
         * @throws IOException 
         */
        public static void dfsDir(File[] childFileArr,String readerUrl,String writerUrl) throws IOException {
            //遍历
            for(File file : childFileArr) {
                //计算到拷贝的目标文件夹名称
                File targetDir = new File(writerUrl+"\\"+file.getName());
                
                //判断
                if(file.isDirectory()) {
                    //是文件夹需要先mkdir targetDir
                     if(!targetDir.exists()){
                         targetDir.mkdirs();
                    }
                    //文件夹dfs搜下去即可
                     dfsDir(file.listFiles(),file.getAbsolutePath(),targetDir.getAbsolutePath());
                }
                else {
                //是文件进行复制
                    copyFileReaderWriter(file.getAbsolutePath(),targetDir.getAbsolutePath());
                }
            }
        }
    
    copyFileReaderWriter,文件的复制, 自行根据使用场景进行替换;比如音频不能用此字符流方法, 字符流多是用于文本复制
    
       /**
        * 根据Url进行文件的复制
        * @param readerUrl 字符流输入流
        * @param writerUrl 字符流输出流
        * @throws IOException
        */
       public static void copyFileReaderWriter(String readerUrl,String writerUrl) throws IOException {
           Reader reader = new FileReader(readerUrl);
           Writer writer = new FileWriter(writerUrl);
           char[] arr = new char[5];
           try {
               int len=0;
               while((len=reader.read(arr))!=-1) {
                   writer.write(new String(arr,0,len));
               }
           } catch (IOException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
           }finally {
               reader.close();
               writer.close();
           }
       }
    
    测试输出
    请输入源目录: D:\base01
    请输入目标目录: D:\base02
    正在将D:\base01目录下全部文件复制到D:\base02.........
    复制成功--
    
    测试结果

    运行成功,所有子文件夹及目录均已拷贝成功.

    相关文章

      网友评论

          本文标题:DFS遍历拷贝所有子文件夹及目录列表 (Java版)

          本文链接:https://www.haomeiwen.com/subject/kyexqctx.html