欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

将目标目录下的全部文件,重命名并拷贝到指定目录。通过文件名表示之前文件的层级关系

程序员文章站 2022-06-16 16:54:24
...

将目标目录下的全部文件,重命名并拷贝到指定目录。通过文件名表示之前文件的层级关系

  • 记录一下自己写的小脚本。

  • 使用场景举个例子:

  • 如:

    • 目标目录为D:\downlad\
    • 下面有图片D:\downlad\abc.picD:\downlad\pic\abc.picD:\downlad\pic\2020\abc.pic
    • 我想把D:\downlad\下各个文件都拷贝到平级目录,但又要保持原先文件在的排序
    • 然后就考虑重命名这些图片。
    • 比如拷贝到D:\trans\,这些文件就变成了:
      1.D:\trans\abc.pic,2.D:\trans\pic_abc.pic,3.D:\trans\pic_2020_abc.pic
    • 这样同文件夹下的文件就会有相同的文件前缀。可以应对大多数整理多层级文件的场景。
  • 下面直接上Java代码

  • 文件名转换工具类

/**
 * @author RedRush
 * @date 2021/6/28 10:53
 * @description: 将根目录下的全部文件,粘贴至目标地址,将之前的路径层级,通过文件名展示
 */
public class TransPicName {

    private String PICHEAD = "picture";		// 重命名的文件头,可以为空
    private String ROOT = "D:\\trans\\";	// 转换完成的输出路径
    private String SOURCE = "D:\\Downloads\\picture\\";	// 要处理目标路径

    @Test
    public void TestGetFiles(){
        int skip = 0, copy = 0;
        List<File> files = getFiles(SOURCE);
        CopyFile copyFile = new CopyFile();
        for(File f : files){
        	// 小文件不予处理,跳过。此块可以不要
            if (skip(f)){
                System.out.println("skip:" + f.getAbsolutePath());
                skip++;
                continue;
            }
            System.out.println(f.getAbsolutePath());
            // 截取要处理的文件路径,并处理路径分隔符
            String picUrl = f.getAbsolutePath().substring(SOURCE.length()).replaceAll("\\\\", "_");
            picUrl = ROOT + PICHEAD + special(picUrl);
            System.out.println(picUrl);
            copyFile.copy(f.getAbsolutePath(), picUrl);
            copy++;
        }
        System.out.println("拷贝任务结束,共" + files.size() + "个文件");
        System.out.println("拷贝" + copy + "个文件,跳过" + skip + "个文件");
    }

    // 目标文件名进行特判处理(比如删除空格,删除一些奇怪的东西)
    public String special(String str){
        String res = str.replaceAll(" ", "");
        // res = res.replaceAll("9", "");
        return res;
    }

    // 小文件跳过
    public boolean skip(File f){
        return f.length() < 1000;
    }

    // 获取目录下的全部文件
    public List<File> getFiles(String path){
        File root = new File(path);
        List<File> files = new ArrayList<File>();
        if(!root.isDirectory()){
            files.add(root);
        }else{
            File[] subFiles = root.listFiles();
            for(File f : subFiles){
                files.addAll(getFiles(f.getAbsolutePath()));
            }
        }
        return files;
    }
}

  • 拷贝工具类
public class CopyFile {

    /**
     * sFile为被拷贝文件的绝对路径
     * tFile为拷贝文件的输出路径
     * */
    public boolean copy(String sFile, String tFile){
        System.out.println("目标文件地址:"+tFile);
        try{
            FileInputStream fis = new FileInputStream(sFile);//创建输入流对象
            FileOutputStream fos = new FileOutputStream(tFile); //创建输出流对象               
            byte datas[] = new byte[1024*8];//创建搬运工具
            int len = 0;//创建长度   
            while((len = fis.read(datas))!=-1){ //循环读取数据
                fos.write(datas,0,len);
            }
            fis.close();//释放资源
            fis.close();//释放资源
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
        return true;
    }
}