说在前面:此项目是跟着B站一位大佬学的,不分享源码,支持项目付费
文章目录
删除文件
这个逻辑是我觉得最复杂,很难理解的一部分。所以单独写一篇来理解。
首先理解,删除文件有两种情况:
1,第一次删除,指的是将这个文件删除后,进入回收站。
2,再次删除,是指将回收站里的文件彻底删除。
这篇写的是第一种,回收站部分的后续再写。
先说最简单的一种删除:删除一个文件
我们这个例子的文件情况如下:
文件1(已删除,进入回收站)
文件夹1文件2
文件夹2(空)
主要关注我圈起来的这几个字段(
file_pid :父Id
folder_type:0是文件夹,1是文件
del_flag:0删除 1回收站 2使用中)
看代码,很好理解,先查询是否有文件1这个文件,然后走到findAllSubFolderFileList这个方法,
将文件1的fileId添加进fileIdList,由于是文件1,它里面不包含文件夹(FOLDER),所以这里就不会进入递归查询,循环结束。最终delFilePidList里只包含文件1的fileId(5383484748),
注意,这里先是执行 updateFileDelFlagBatch(delFilePidList,null),将文件1的fileId(5383484748)传过去,在mapper里,执行寻找file_pid为(5383484748)的文件,将那些文件设为DEL(删除),实际上这里并没有子文件。
然后执行下面的 updateFileDelFlagBatch(null,delFileIdList),
这个就是来处理文件1了,将file_id为(5383484748),也就是将文件1设置为RECYLE(回收站)。结束。
然后来看删除文件夹的情况!!!
这里删除文件夹1(里面还包含文件2和文件夹2),删除后,在回收站中,只能看到最外层也就是文件夹1,它里面的东西我们是无法点进去看的了。
首先进入findAllSubFolderFileList方法,先将文件夹1的file_id(8926786988)添加进fileIdList,然后这回是文件夹,List fileInfoList=fileInfoMapper.selectList(query)就找到文件夹1下的所有子文件夹(也就是文件夹2),然后再递归,将文件夹2的file_id(2006777512)添加进fileIdList。因为文件夹2下没有文件夹了,递归结束,delFilePidList里面就有文件夹1和它的子文件夹2的file_id。
然后就是走updateFileDelFlagBatch(delFilePidList,null),将file_pid为文件夹1和文件夹2的file_id的子文件(也就是文件2和文件夹2)状态更新为DEL(删除)。
最后走updateFileDelFlagBatch(null,delFileIdList),来处理文件夹1,将其状态设置为RECYLE(回收站),结束。
findAllSubFolderFileList:找该文件(夹)及其子文件夹。
updateFileDelFlagBatch(delFilePidList,null):更新子文件(夹)状态
updateFileDelFlagBatch(null,delFileIdList):更新选中文件(夹)状态
总的来说,就是将顶层文件(夹)设置为回收站,其底层子文件(夹)设置为删除。