将文件按照文件名创建文件夹保存

介绍

        场景:有一个图片的压缩包,里面的图片是按照系列存的。上传图片时需要按商品编号找到文件夹,进入文件夹选取里面的图片。所以写了下面的,按照文件名创建文件夹,然后把所有文件名的图片放进去,如果一个文件名有多个图片,则文件名按照后缀加-0,-1区别。例如,有一个商品图片,有3张,D304,分别存在3个文件夹中。经过处理后需要创建一个D304的文件夹,然后把3张图片存进去,名称分别为D304, D304-1,D304-2。

代码

实现代码如下:

package com.example.demoimg.test;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;

public class CopyFilesToDirectories7 {

    public static final String nameList = "J313327, J313330";


    public static void main(String[] args) {
        // 源文件夹
        File sourceFolder = new File("C:\\Users\\yf01\\Documents\\img\\123");
        File[] files = sourceFolder.listFiles();

//        String name11 = "D8129";

        if (files != null) {
            for (File file : files) {
                getFile(file);
            }
        }

        System.out.println("Files copied to directories successfully.");
    }

    private static void getFile(File file) {
//        String name11 = "DG548129";
        if (file.isFile()) {


            String fileName = file.getName();
            String ssName = fileName.substring(0, fileName.lastIndexOf("."));


            if (!nameList.contains(ssName)) {
                return;
            }
//
            System.out.println("找到文件");




            String folderName = fileName.substring(0, fileName.lastIndexOf("."));
            // E:/destination_folder/
            File destinationFolder = new File("D:\\img2\\" + folderName);
            int index = 1;
            File destinationFile = new File("D:\\img2\\" + folderName+ "\\" + fileName);


            // 文件夹存在就处理文件名
            if (destinationFolder.exists()) {
                while (destinationFile.exists()) {
                    String baseName = fileName.substring(0, fileName.lastIndexOf("."));
                    String extension = fileName.substring(fileName.lastIndexOf("."));
                    String newFileName = baseName + "_" + index + extension;
                    destinationFile = new File("D:\\img2\\" + folderName+ "\\" + newFileName);
                    index++;
                }
            }else {

                destinationFolder.mkdirs();
            }

            try {
                Files.copy(file.toPath(), destinationFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
            } catch (IOException e) {
                System.err.println("Error copying file: " + e.getMessage());
            }
        }else if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files != null) {
                for (File file2 : files) {
                    getFile(file2);
                }
            }
        }
    }
}

以下是网页下载图片的代码,没用

package com.example.demoimg.test;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.*;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
public class test1 {

    public static void main(String[] args) {
        for (int i = 2500; i <= 3000; i++) {
//            getImg(i);
        }

        System.out.println("完成");
    }

    private static void getss() {
        System.out.println("开始--" + 1);
        String url = "http://test.com/item.html?item_id=" + 1;

        try {
            Document doc = Jsoup.connect(url).get();

            Elements images = doc.select(".goods_box .show-box img");
            Elements ulElements = doc.select(".goods_gy ul");

            for (int j = 0; j < images.size(); j++) {
                Element img = images.get(j);
                Element ulElement = ulElements.get(0); // Assuming there is only one ul element

                String text = ulElement.text();
                int end = text.indexOf("<li>");
                String aliasValue = text.substring(end) + "j";

                String src = img.attr("src");
                System.out.println(aliasValue + "_" + j + ": " + src);
                // 下载图片到文件夹
                downLoadImg(src, aliasValue);
            }
        } catch (IOException e) {
            System.err.println("Error fetching images: " + e.getMessage());
        }
    }




    private static void getImg(int i) {
        System.out.println("开始--" + i);
        String url = "http://test.com/item.html?item_id=" + i;

        try {
            Document doc = Jsoup.connect(url).get();

            Elements images = doc.select(".goods_box .show-box img");
            Elements ulElements = doc.select(".goods_gy ul");

            for (int j = 0; j < images.size(); j++) {
                Element img = images.get(j);
                Element ulElement = ulElements.get(0); // Assuming there is only one ul element

                String text = ulElement.text();
                int end = text.indexOf("<li>");
                String aliasValue = text.substring(end) + "j";

                String src = img.attr("src");
                System.out.println(aliasValue + "_" + j + ": " + src);
                // 下载图片到文件夹
                downLoadImg(src, aliasValue);
            }
        } catch (IOException e) {
            System.err.println("Error fetching images: " + e.getMessage());
        }
    }

    public static void downLoadImg(String imageUrl, String fileName) {
//        imageUrl = "http://test/images/8c/29/af/e221b6a084179edcdd0f3875c2b404dc593e4bef.jpg_l.jpg";
        String folderPath = "D:/img/";
//        String fileName = "A112.jpg";

        try {
            URL url = new URL(imageUrl);
            InputStream in = url.openStream();

            Path outputPath = FileSystems.getDefault().getPath(folderPath, fileName);// Path.of(folderPath + fileName);
            Files.copy(in, outputPath, StandardCopyOption.REPLACE_EXISTING);

            System.out.println("图片下载成功");
        } catch (IOException e) {
            System.err.println("图片下载失败: " + e.getMessage());
        }
    }


    public static void download(String urlString, String savePath, String filename) throws IOException {
        // 构造URL
        URL url = new URL(urlString);
        // 打开连接
        URLConnection con = url.openConnection();
        //设置请求超时为20s
        con.setConnectTimeout(20 * 1000);
        //文件路径不存在 则创建
        File sf = new File(savePath);
        if (!sf.exists()) {
            sf.mkdirs();
        }
        //jdk 1.7 新特性自动关闭
        try (InputStream in = con.getInputStream();
             OutputStream out = new FileOutputStream(sf.getPath() + "\\" + filename)) {
            //创建缓冲区
            byte[] buff = new byte[1024];
            int n;
            // 开始读取
            while ((n = in.read(buff)) >= 0) {
                out.write(buff, 0, n);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

}

<think>好的,我现在需要帮助用户实现根据文件名创建文件夹移动文件的功能。用户提到了几种不同的方法,包括批处理脚本和Python脚本,我需要先理解这些方法的不同之处,以及用户的具体需求。 首先,用户提供的引用内容中有三个不同的解决方案:一个是批处理脚本(BAT),另一个是Python脚本。用户可能希望知道如何在不同环境下实现这个功能,或者想知道哪种方法更适合他们的具体情况。我需要比较这两种方法的优缺点,给出清晰的步骤说明。 接下来,我需要确保回答结构清晰,符合用户的要求。用户希望分步解释,且生成相关问题。同时,必须使用中文,且正确应用LaTeX格式。不过,这个问题主要涉及文件操作,可能不需要太多数学公式,但如果有变量或路径表达式,可能需要用行内LaTeX,比如$filename$。 我需要先整理批处理脚本的步骤。根据引用[1]和引用[2],批处理脚本使用for循环遍历文件,分割文件名创建文件夹,然后移动文件。用户可能需要详细的步骤解释,比如如何分割文件名,如何处理不同的文件类型,以及如何避免移动脚本自身。 然后是Python脚本的方法,引用[3]中的代码使用os和shutil库,遍历文件创建目录移动文件。Python的方法可能更灵活,适合处理更复杂的文件名结构或需要更多逻辑判断的情况。需要解释代码的关键部分,比如os.walk的使用,路径拼接,以及异常处理。 用户可能不太清楚批处理和Python之间的选择,所以需要比较两者的适用场景。比如,批处理适合Windows用户快速处理,无需安装其他环境;而Python适合跨平台或需要更复杂处理的情况。 另外,需要注意用户提到的文件名可能带有多个点号,比如“电影1.1994.xxx.mkv”,这时候批处理中的delims=.可能会错误地分割。例如,如果文件名是“电影1.1994.mkv”,使用tokens=1-2的话,%%a会是“电影1”,%%b是“1994”,而扩展名是mkv。但用户可能希望文件夹名是“电影1”而不是包含年份的部分,或者可能需要调整tokens的数量。这时候需要提醒用户根据实际文件名结构调整delims和tokens的设置。 在Python脚本中,使用os.path.splitext可以正确分割主文件名和扩展名,但如果有多个点号,比如“file.name.txt”,splitext会分成(“file.name”, “.txt”)。这可能更符合用户的需求,因为通常最后一个点号后面是扩展名。所以需要指出这一点差异。 还要考虑文件夹重名的情况,比如是否允许覆盖,或者如果文件夹已存在时如何处理。在批处理中,使用if not exist来检查文件夹是否存在,不存在则创建。Python中的os.mkdir如果文件夹已存在会抛出错误,所以需要用os.makedirs(..., exist_ok=True)来避免错误。 用户可能遇到的问题包括:文件名中有空格导致路径处理错误,特殊字符的处理,权限问题,或者文件正在使用中无法移动。这些需要在注意事项中提到。 生成的相关问题需要围绕这个功能的扩展,比如处理多层目录、处理重复文件名、添加日志功能、错误处理,或者如何反向操作(将子文件夹中的文件移回父目录)。这些都是用户可能进一步想了解的内容。 最后,确保回答的结构符合用户要求:分步说明两种方法,每种方法包含步骤和代码示例,注意事项,以及相关问题。同时,引用正确的来源,比如引用[1]、[2]、[3]中的不同方法,在末尾添加引用标识。</think>以下是实现根据文件名自动创建文件夹移动文件的解决方案: ### 一、解决方案步骤 #### 方法1:Windows批处理脚本(BAT) 1. **准备脚本文件** 新建文本文件,粘贴以下代码保存为`.bat`格式: ```bat @echo off cd /d "%~dp0" for %%a in (*.*) do ( if not "%%~na" == "%~n0" ( if not exist "%%~na\" md "%%~na" move "%%a" "%%~na\" ) ) pause ``` *说明:`%~n0`排除脚本自身文件,`%%~na`提取文件名(不含扩展名)[^2]* 2. **运行脚本** 将`.bat`文件与目标文件放在同一目录,双击运行。 #### 方法2:Python脚本 ```python import os import shutil def organize_files(): current_dir = os.getcwd() for filename in os.listdir(current_dir): if os.path.isfile(filename) and filename != os.path.basename(__file__): # 分离文件名与扩展名 name_part = os.path.splitext(filename)[0] # 创建目标文件夹 target_dir = os.path.join(current_dir, name_part) os.makedirs(target_dir, exist_ok=True) # 移动文件 shutil.move(os.path.join(current_dir, filename), os.path.join(target_dir, filename)) if __name__ == "__main__": organize_files() ``` *说明:使用`os.makedirs`的`exist_ok=True`参数避免重复创建报错[^3]* ### 二、关键逻辑对比 | 功能 | BAT脚本 | Python脚本 | |--------------------|------------------------------------|-------------------------------| | 文件名分割 | 通过`%%~na`直接提取 | 使用`os.path.splitext`方法 | | 扩展名处理 | 自动忽略 | 精确分离主名和扩展名 | | 异常处理 | 无自动错误捕获 | 可添加`try-except`逻辑 | | 跨平台支持 | 仅限Windows | 支持全平台 | ### 三、注意事项 1. 文件名中包含`.`的情况 - BAT脚本会将`报告v1.2.pdf`识别为`报告v1`,建议使用Python脚本处理复杂命名 2. 系统权限问题 需要确保对目标目录有写入权限 3. 文件占用锁定 移动前关闭正在使用的文件 ### 四、进阶优化建议 - 添加日志记录:记录成功/失败操作 - 增加过滤条件:例如只处理`$指定扩展名$`(如`.mp4,.mkv`) - 处理子目录:通过`for /r`或`os.walk()`实现递归操作
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值