【网盘系统】递归删除批量文件

为何需要用到递归?

在网盘系统中,文件的类型分为文件和文件夹两种类型。当我们想要批量删除文件时,不乏其中会包含文件夹,而想要删除这个文件夹,自然其中所包含的文件都要删除,而其中所包含的文件也有可能是文件夹,所以需要用到递归。

代码实现(Service层)

    /*** 删除文件到回收站* @param fileIds* @param userId*/@Overridepublic void removeFileToRecycleBin(String fileIds, String userId) {String[] fileIdArray = fileIds.split(",");LambdaQueryWrapper<FileInfo> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(FileInfo::getUserId, userId).in(FileInfo::getFileId, Arrays.asList(fileIdArray)).eq(FileInfo::getDelFlag, FileDelFlagEnums.USING.getFlag());List<FileInfo> fileInfoList = this.baseMapper.selectList(queryWrapper);if(fileInfoList.isEmpty()){return;}List<String> delFilePidList = new ArrayList<>();for (FileInfo fileInfo : fileInfoList) {findAllSubFolderList(delFilePidList, userId, fileInfo.getFileId(), FileDelFlagEnums.USING.getFlag());}if(!delFilePidList.isEmpty()){// 将这些目录下的所有文件标记为“已删除”LambdaUpdateWrapper<FileInfo> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.eq(FileInfo::getUserId, userId).in(FileInfo::getFilePid, delFilePidList).eq(FileInfo::getDelFlag, FileDelFlagEnums.USING.getFlag());FileInfo updateFileInfo = new FileInfo();updateFileInfo.setDelFlag(FileDelFlagEnums.DEL.getFlag());this.baseMapper.update(updateFileInfo, updateWrapper);}// 将选中的文件标记为“回收站”List<String> delFileIdList = Arrays.asList(fileIdArray);LambdaUpdateWrapper<FileInfo> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.eq(FileInfo::getUserId, userId).in(FileInfo::getFileId, delFileIdList);FileInfo updateFileInfo = new FileInfo();updateFileInfo.setDelFlag(FileDelFlagEnums.RECYCLE.getFlag());updateFileInfo.setRecoveryTime(new Date());this.baseMapper.update(updateFileInfo, updateWrapper);}

文件的DelFlag类型有三种,正常、回收站、删除。只有选中的文件会被标记为“回收站”,而选中的文件夹内包含的文件则是标记为“已删除”。

为什么要这么设计呢?

可以参考我们windows的回收站,当我们把一个文件夹扔进回收站后,会发现在回收站中是不能把这个文件夹打开,自然也就无法看到文件夹中的文件了,所以文件夹中的文件就不需要标记为"回收站",直接标记为“已删除”。当我们需要去恢复时,只需要将那些父id为这个文件夹的文件重新标记为"正常"即可。

上述代码中用到的"findAllSubFolderList"就是递归查找目标目录下的所有目录的方法,让我们看看实现的代码:

    /*** 递归查找目标目录下的所有目录* @param fileIdList* @param userId* @param fileId* @param delFlag*/private void findAllSubFolderList(List<String> fileIdList, String userId, String fileId, Integer delFlag){fileIdList.add(fileId);LambdaQueryWrapper<FileInfo> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(FileInfo::getUserId, userId).eq(FileInfo::getFilePid, fileId).eq(FileInfo::getDelFlag, delFlag).eq(FileInfo::getFolderType, FileFolderTypeEnums.FOLDER.getType());//  找到这个目录的所有子目录List<FileInfo> fileInfoList = this.baseMapper.selectList(queryWrapper);// 递归查找所有子目录下的所有文件for (FileInfo fileInfo : fileInfoList) {findAllSubFolderList(fileIdList, userId, fileInfo.getFileId(), delFlag);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/34720.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Lakehouse 架构下的元数据“大一统”管理深度解析

在湖仓一体&#xff08;Lakehouse&#xff09;出现之前&#xff0c;数据仓库和数据湖堪称数据领域的两大“顶流”。打个比方&#xff0c;要是把数据仓库比作一座大型图书馆&#xff0c;那其中的数据就如同馆内藏书&#xff0c;需要按照规范放好&#xff0c;借阅者只需依照类别索…

【AI系统】MobileVit 系列

MobileVit 系列 自 Vision Transformer 出现之后&#xff0c;人们发现 Transformer 也可以应用在计算机视觉领域&#xff0c;并且效果还是非常不错的。但是基于 Transformer 的网络模型通常具有数十亿或数百亿个参数&#xff0c;这使得它们的模型文件非常大&#xff0c;不仅占…

投稿指南——论文检索报告如何开具

【SciencePub学术】论文发表被SCI数据库收录之后&#xff0c;作为学术成果上报时&#xff0c;一般需要提供论文检索报告&#xff0c;SCI论文检索报告怎么开&#xff1f;在哪开&#xff1f;要注意什么&#xff1f;这些问题&#xff0c;本期小编给大家解答一下。 Q 开具检索报告…

Jenkins 推送报错 - SSH 密钥失效

目录 问题描述报错原因解决方案 问题描述 jenkins 构建完毕后&#xff0c;将构建好的 jar 包推送至远端服务器时&#xff0c;Deploy 阶段报如下错误&#xff1a; sshpass -p **** scp -o StrictHostKeyCheckingno -P 22 -r /data/jenkins/workspace/TAI/TAI/AllCam-tai-cloud/…

《ODIN: A Single Model for 2D and 3D Segmentation》CVPR2024

斯坦福和微软&#xff1a; 代码链接&#xff1a;ODIN: A Single Model For 2D and 3D Perception 论文链接&#xff1a;2401.02416 摘要 这篇论文介绍了ODIN&#xff08;Omni-Dimensional INstance segmentation&#xff09;&#xff0c;一个能够同时处理2D RGB图像和3D点云…

三、代码管理-Git

文章目录 前言一、Git1. Git 与 SVN 区别2. Git 入门3. 客户端工具4. 主流Git仓库 二、GitLab1. 介绍2. 适合的场景 二、GitHub1. 介绍2. 适合的场景 三、Gitee1. 介绍2. 适合的场景 四、GitCode1. 介绍2. 适合的场景 五、总结 前言 代码托管‌ Git作为目前最为流行的版本控制…

npm, yarn, pnpm之间的区别

前言 在现代化的开发中&#xff0c;一个人可能同时开发多个项目&#xff0c;安装的项目越来越多&#xff0c;所随之安装的依赖包也越来越臃肿&#xff0c;而且有时候所安装的速度也很慢&#xff0c;甚至会安装失败。 因此我们就需要去了解一下&#xff0c;我们的包管理器&#…

vscode上传本地文件到服务器

vscode上传本地文件到服务器 首先下载插件SFTP&#xff0c;我们通过ftp进行文件传输 VScode打开要传输的文件 使用快捷键 ctrlshiftP 打开搜索窗口&#xff0c;搜索SFTP 点击之后vscode文件夹下会生成对应json文件 我们编辑json信息根据远程的服务器情况填写&#xff0c;比如…

Next.js 实战 (二):搭建 Layouts 基础排版布局

前言 等了许久&#xff0c;Next.js 终于迎来了 v15.x 版本&#xff0c;刚好 Github 上面的旧项目重构完&#xff0c;终于可以放心大胆地去研究 Next.js了。 搭建最新项目可以参考官方文档&#xff1a;Installation 最新的 Next.js 版本&#xff0c;使用的是 React19.x 内测版…

Java的Stirng、StringBuilder、StringJoiner

黑马程序员Java个人笔记 目录 字符串比较 比较 boolean equals boolean equalsIgnoreCase 键盘录入和定义的字符串的比较 StringBuilder 打印 ​编辑 添加元素 反转 获取长度 toString 练习 对称字符串 拼接字符串 StringJoiner 概述 ​编辑 构造方法 只有…

elasticsearch(三)

文章目录 1.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.2.1.Bucket聚合语法1.2.2.聚合结果排序1.2.3.限定聚合范围1.2.4.Metric聚合语法 1.3.RestAPI实现聚合1.3.1.API语法1.3.2.业务需求1.3.3.业务实现 2.自动补全2.1.拼音分词器2.2.自定义分词器2.3.自动补全查询2.4.实现酒店搜…

Python_Flask03

这篇文章主要介绍的是数据库的增删改查操作&#xff0c;无多余好说的。 from flask import Flask from flask_sqlalchemy import SQLAlchemy from sqlalchemy import text from flask_migrate import Migrateapp Flask(__name__)# 本地基础信息的主机名 HOSTNAME "127.0…

Hive分区值的插入

对于Hive分区表&#xff0c;在我们插入数据的时候需要指定对应的分区值&#xff0c;而这里就会涉及很多种情况。比如静态分区插入、动态分区插入、提供的分区值和分区字段类型不一致&#xff0c;或者提供的分区值是NULL的情况&#xff0c;下面我们依次来展现下不同情况下的表现…

安达发|工业镜头APS高级排产的关键约束

工业镜头生产具有其特定的复杂性&#xff0c;如技术要求高、生产周期长、工序多等特点。在应用APS系统进行高级排产时&#xff0c;需要考虑以下关键约束&#xff1a; 1. 技术与质量约束 - 精度要求&#xff1a;工业镜头对精度的要求极高&#xff0c;这直接影响到排产计划中机加…

【SKFramework框架核心模块】3-9、资源模块

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群&#xff1a;398291828小红书小破站 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…

Swing中密码框组件

一、介绍 密码框&#xff08;JPasswordField&#xff09;与文本框的定义和用法基本相同&#xff0c;唯一不同的是密码框将用户输入的字符串以某种符号进行加密。密码框对象是通过javax.swing.JPasswordField类创建的。 二、常用构造方法 1、public JPasswordField() 2、pub…

SpringMVC ——(1)

1.SpringMVC请求流程 1.1 SpringMVC请求处理流程分析 Spring MVC框架也是⼀个基于请求驱动的Web框架&#xff0c;并且使⽤了前端控制器模式&#xff08;是⽤来提供⼀个集中的请求处理机制&#xff0c;所有的请求都将由⼀个单⼀的处理程序处理来进⾏设计&#xff0c;再根据请求…

【英一】1998年

阅读1 suffering. 苦难at the mercy of. 完全受...的支配do ones bidding. 服从某人threaten to. 可能...&#xff08;发生不好的事情&#xff09;do more harm than good. 弊大于利strive to. 争取&#xff0c;努力assert. 主张cement. 巩固bid for. (尤指许下诺言)企图获得&…

BT.1120视频传输协议标准介绍

1.BT.1120 BT.656 协议主要是针对 PAL、NTSC下的标清视频。随着高清视频的发展的需要&#xff0c;又推出了 BT.1120 标准&#xff0c;它与 BT656 有许多类似的地方&#xff0c;不同点在于时钟频率更高了&#xff0c;更加适合高清视频的传输&#xff0c;隔行传输和逐行传输兼备。…

RabbitMQ学习-Eleven

SpringBoot中RabbitMQ的消息确认和Return机制 1.再application.yml文件中开启消息确认机制和return机制 spring:rabbitmq:publisher-confirm-type: simplepublisher-returns: true 2.创建confirm和return监听 // MsgConfirmAndReturn.java 中的代码片段Component public cla…