当前位置: 首页 > ds >正文

【EasyPan】removeFile2RecycleBatch方法及递归操作解析

【EasyPan】项目常见问题解答(自用&持续更新中…)汇总版

文件批量转移到回收站方法解析

一、方法总述

removeFile2RecycleBatch方法实现将用户选中的文件/目录及其子内容批量移入回收站的业务逻辑,主要特点:

  • 递归处理:深度遍历文件夹层级结构
  • 双重状态更新:区分直接删除和回收站保留
  • 批量操作:基于文件ID集合的批量SQL执行
  • 事务安全:依赖MyBatis事务管理保证一致性

二、方法流程及时序图

核心处理流程

客户端 服务层 持久层 数据库 调用removeFile2RecycleBatch(userId, fileIds) 解析fileIds为数组 查询有效文件列表(query) SELECT...WHERE del_flag=’使用中‘ 返回fileInfoList 直接返回 递归查找子文件夹(findAllSubFolderFileList) loop [遍历文件列表] 批量更新子文件状态(updateFileDelFlagBatch) 批量更新选中文件状态(updateFileDelFlagBatch) alt [结果为空] [存在数据] 客户端 服务层 持久层 数据库

三、方法模块化解析

1. 数据准备模块

// 输入参数处理
String[] fileIdArray = fileIds.split(","); // 构建基础查询条件
FileInfoQuery query = new FileInfoQuery();
query.setUserId(userId);
query.setFileIdArray(fileIdArray);
query.setDelFlag(FileDelFlagEnums.USING.getFlag()); // del_flag=0

关键设计

  • 使用逗号分隔符处理批量ID
  • 严格限定用户权限(userId)
  • 只操作正常状态的文件(del_flag=0)

2. 递归查找模块

private void findAllSubFolderFileList(List<String> fileIdList, String userId, String fileId, Integer delFlag) {// 递归终止条件:无子文件夹时自动结束// 递归过程:深度优先遍历文件夹树
}

处理逻辑

  1. 将当前文件夹ID加入结果集
  2. 查询该文件夹下的所有子文件夹
  3. 对每个子文件夹递归执行相同操作

3. 状态更新模块

子文件删除操作
// 更新条件:
// - 文件PID在delFilePidList中
// - 当前del_flag=0
this.fileInfoMapper.updateFileDelFlagBatch(updateInfo, userId, delFilePidList,  // 基于父ID的条件null, FileDelFlagEnums.USING.getFlag()
);
选中文件回收站操作
// 更新条件:
// - 文件ID在delFileIdList中
// - 当前del_flag=0
this.fileInfoMapper.updateFileDelFlagBatch(fileInfo, userId, null, delFileIdList,  // 基于自身ID的条件FileDelFlagEnums.USING.getFlag()
);

递归操作解析与示例

一、递归原理图解

根文件夹F1
子文件夹F1-1
子文件夹F1-2
文件F1-1-1
文件夹F1-1-2
文件F1-1-2-1
文件F1-2-1

二、代码中的递归实现

private void findAllSubFolderFileList(List<String> fileIdList, String userId, String fileId, Integer delFlag) {// 1. 将当前文件夹ID加入结果集fileIdList.add(fileId); // 2. 查询当前文件夹下的所有子文件夹FileInfoQuery query = new FileInfoQuery();query.setUserId(userId);query.setFilePid(fileId); // 关键:设置父ID条件query.setDelFlag(delFlag);query.setFolderType(FileFolderTypeEnums.FOLDER.getType());// 3. 获取子文件夹列表List<FileInfo> subFolders = this.fileInfoMapper.selectList(query);// 4. 递归处理每个子文件夹for (FileInfo subFolder : subFolders) {findAllSubFolderFileList(fileIdList, userId, subFolder.getFileId(), delFlag);}
}

三、递归执行过程示例

原始文件夹结构

根文件夹 (fileId: "F0")
├─ 子文件夹1 (fileId: "F1", filePid: "F0") ← 用户选中要删除的
│  ├─ 文件1 (fileId: "F11", filePid: "F1")
│  └─ 子文件夹2 (fileId: "F12", filePid: "F1")
│     └─ 文件2 (fileId: "F121", filePid: "F12")
└─ 子文件夹3 (fileId: "F2", filePid: "F0") ← 用户同时选中的另一个独立文件夹

执行后状态变化

文件/文件夹原状态新状态可见性
F1 (选中的文件夹)USING (0)RECYCLE (2)回收站可见
F11USING (0)DEL (1)回收站不可见
F12USING (0)DEL (1)回收站不可见
F121USING (0)DEL (1)回收站不可见
F2 (选中的文件夹)USING (0)RECYCLE (2)回收站可见

递归调用栈演示

用户 服务 数据库 删除F1,F2 查询F1,F2信息 返回F1,F2数据 查询F1子文件夹(F11,F12) 返回子项 查询F12子文件夹(F121) 返回F121 loop [递归处理F1] 批量更新(F11,F12,F121)→DEL 批量更新(F1,F2)→RECYCLE 用户 服务 数据库

四、递归过程详解

1. 递归调用栈

// 第一轮递归(处理F1)
findAllSubFolderFileList(list, "user1", "F1", 0)|- 添加F1到list|- 发现子项F11(文件)F12(文件夹)|- 处理F12:|- 添加F12到list|- 发现子项F121(文件)

2. 最终生成的ID列表

delFilePidList = ["F1", "F12", "F121"] // 所有包含子项的文件夹ID
delFileIdList = ["F1", "F2"]   // 用户直接选中的ID

五、状态转换验证

初始状态
子文件/文件夹
用户选中项
USING
DEL
RECYCLE


代码:

/*** 批量将文件/文件夹移动到回收站* @param userId 用户ID* @param fileIds 要删除的文件ID列表,多个用逗号分隔*/
@Override
public void removeFile2RecycleBatch(String userId, String fileIds) {// 1. 参数预处理:将逗号分隔的字符串转为数组String[] fileIdArray = fileIds.split(",");// 2. 构建查询条件:查询用户选中的有效文件FileInfoQuery query = new FileInfoQuery();query.setUserId(userId); // 限制用户权限query.setFileIdArray(fileIdArray); // 设置目标文件IDquery.setDelFlag(FileDelFlagEnums.USING.getFlag()); // 只查询未删除的文件(del_flag=0)// 3. 执行查询获取文件列表List<FileInfo> fileInfoList = this.fileInfoMapper.selectList(query);if (fileInfoList.isEmpty()) {return; // 如果没有符合条件的文件直接返回}// 4. 递归查找所有需要删除的子文件夹(深度优先遍历)List<String> delFilePidList = new ArrayList<>(); // 存储所有子文件夹IDfor (FileInfo fileInfo : fileInfoList) {// 只处理文件夹类型(文件不需要递归)if(FileFolderTypeEnums.FOLDER.getType().equals(fileInfo.getFolderType())) {findAllSubFolderFileList(delFilePidList, userId, fileInfo.getFileId(), FileDelFlagEnums.USING.getFlag());}}// 5. 批量更新子文件状态为完全删除(del_flag=1)if(!delFilePidList.isEmpty()) {FileInfo updateInfo = new FileInfo();updateInfo.setDelFlag(FileDelFlagEnums.DEL.getFlag()); // 设置删除状态// 执行批量更新:将这些子文件夹下的所有内容标记为删除this.fileInfoMapper.updateFileDelFlagBatch(updateInfo, userId, delFilePidList, null, FileDelFlagEnums.USING.getFlag());}// 6. 将用户选中的文件/文件夹标记为回收站状态(del_flag=2)List<String> delFileIdList = Arrays.asList(fileIdArray); // 用户原始选择的文件IDFileInfo fileInfo = new FileInfo();fileInfo.setRecoveryTime(new Date()); // 设置回收时间fileInfo.setDelFlag(FileDelFlagEnums.RECYCLE.getFlag()); // 设置回收站状态// 执行批量更新:将用户直接选中的文件放入回收站this.fileInfoMapper.updateFileDelFlagBatch(fileInfo, userId, null, delFileIdList, FileDelFlagEnums.USING.getFlag());
}/*** 递归查找所有子文件夹* @param fileIdList 结果收集列表(输出参数)* @param userId 用户ID(权限控制)* @param fileId 当前处理的文件夹ID* @param delFlag 文件状态筛选条件(0=正常)*/
private void findAllSubFolderFileList(List<String> fileIdList, String userId, String fileId, Integer delFlag) {// 1. 将当前文件夹ID加入结果集fileIdList.add(fileId);// 2. 构建查询条件:查找当前文件夹下的子文件夹FileInfoQuery query = new FileInfoQuery();query.setUserId(userId); // 用户隔离query.setFilePid(fileId); // 子项条件:parent_id=当前文件夹IDquery.setDelFlag(delFlag); // 状态条件:del_flag=0query.setFolderType(FileFolderTypeEnums.FOLDER.getType()); // 只查询文件夹类型// 3. 查询子文件夹列表List<FileInfo> fileInfoList = this.fileInfoMapper.selectList(query);// 4. 递归处理每个子文件夹for (FileInfo fileInfo : fileInfoList) {findAllSubFolderFileList(fileIdList, userId, fileInfo.getFileId(), delFlag);}
}
http://www.xdnf.cn/news/1550.html

相关文章:

  • GD32F407单片机开发入门(六)定时器TIMER详解及实战含源码
  • 18487.1-2015-解读笔记三-交流充电之车桩交互-PWM
  • 集结号海螺捕鱼组件搭建教程与源码结构详解(第一篇)
  • Hi3518E官方录像例程源码流程分析(五)
  • 【论文解读】----Question Answering and Grounding for Remote Sensing Change Detection
  • 【前沿技术解析】钠离子电池突破性进展:低成本+高安全重塑新能源产业格局
  • 深入理解XGBoost(何龙 著)学习笔记(一)
  • pojovoDto等概念
  • DocsGPT remote接口RCE(CVE-2025-0868)
  • 【金仓数据库征文】从 HTAP 到 AI 加速,KingbaseES 的未来之路
  • 【AI提示词】公司法律顾问
  • 67 款 App 因违规收集个人信息被通报 隐私合规检测成重新上架门槛
  • 深入解析HashMap的特性以及源码
  • PH热榜 | 2025-04-23
  • 声纹振动传感器在电力监测领域的应用
  • JVM虚拟机-JVM调优、内存泄漏排查、CPU飙高排查
  • URI、URL与URN详解概念介绍
  • JDK 7 Update 0 (64位) 详细Windows 安装指南
  • 项目初期如何快速组建高效团队
  • 变压器的三明治绕法
  • 体积小巧的 Word 转 PDF 批量工具
  • 免费且开源的企业级监控解决方案:Zabbix
  • MySQL存储过程
  • 初识Redis · 持久化
  • 基于LangChain的RAG召回率增强技术实现:智能分块策略实现、多路召回与重排序实现、异构数据溯源与关联实现
  • Windows上使用Python 3.10结合Appium-实现APP自动化
  • 机器视觉的智能手机屏贴合应用
  • Java单例模式详解:实现线程安全的全局访问点
  • 小白自学python第一天
  • 天梯-这是字符串题