From 40b82d9cb6ef466551e5cfe48df0b60232734bc1 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sat, 9 Nov 2024 18:23:08 +0800 Subject: [PATCH] =?UTF-8?q?fix=20#3042=20=E7=A7=BB=E5=8A=A8=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=88=A0=E9=99=A4=E7=A9=BA=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/chain/storage.py | 18 +++++++---------- app/chain/transfer.py | 8 +++++++- app/modules/filemanager/__init__.py | 31 ++++++++++++++++++++++++++++- app/monitor.py | 8 +++++++- 4 files changed, 51 insertions(+), 14 deletions(-) diff --git a/app/chain/storage.py b/app/chain/storage.py index d7852cbe..a38b234f 100644 --- a/app/chain/storage.py +++ b/app/chain/storage.py @@ -37,6 +37,12 @@ class StorageChain(ChainBase): """ return self.run_module("list_files", fileitem=fileitem, recursion=recursion) + def any_files(self, fileitem: schemas.FileItem, extensions: list = None) -> Optional[bool]: + """ + 查询当前目录下是否存在指定扩展名任意文件 + """ + return self.run_module("any_files", fileitem=fileitem, extensions=extensions) + def create_folder(self, fileitem: schemas.FileItem, name: str) -> Optional[schemas.FileItem]: """ 创建目录 @@ -116,18 +122,8 @@ class StorageChain(ChainBase): else: dir_item = self.get_parent_item(fileitem) if dir_item: - files = self.list_files(dir_item, recursion=True) - - # 是否存在其他媒体文件 - media_file_exist = False - if files: - for file in files: - if file.extension and f".{file.extension.lower()}" in settings.RMT_MEDIAEXT: - media_file_exist = True - break # 不存在其他媒体文件,删除空目录 - if not media_file_exist: - # 返回空目录删除状态 + if not self.any_files(dir_item, extensions=settings.RMT_MEDIAEXT): return self.delete_file(dir_item) # 存在媒体文件,返回文件删除状态 diff --git a/app/chain/transfer.py b/app/chain/transfer.py index adcbcdb6..f5f6c4df 100644 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -494,7 +494,13 @@ class TransferChain(ChainBase): # 删除残留文件 if fileitem: logger.warn(f"删除残留文件夹:【{fileitem.storage}】{fileitem.path}") - self.storagechain.delete_file(fileitem) + if self.storagechain.delete_file(fileitem): + # 删除空的父目录 + dir_item = self.storagechain.get_parent_item(fileitem) + if dir_item: + if not self.storagechain.any_files(dir_item, extensions=settings.RMT_MEDIAEXT): + logger.warn(f"正在删除空目录:【{dir_item.storage}】{dir_item.path}") + return self.storagechain.delete_file(dir_item) # 结束进度 logger.info(f"{fileitem.path} 整理完成,共 {total_num} 个文件," diff --git a/app/modules/filemanager/__init__.py b/app/modules/filemanager/__init__.py index 72444285..badc24a6 100644 --- a/app/modules/filemanager/__init__.py +++ b/app/modules/filemanager/__init__.py @@ -195,7 +195,36 @@ class FileManagerModule(_ModuleBase): result = [] __get_files(fileitem, recursion) - return result + return + + def any_files(self, fileitem: FileItem, extensions: list = None) -> Optional[bool]: + """ + 查询当前目录下是否存在指定扩展名任意文件 + """ + storage_oper = self.__get_storage_oper(fileitem.storage) + if not storage_oper: + logger.error(f"不支持 {fileitem.storage} 的文件浏览") + return None + + def __any_file(_item: FileItem): + """ + 递归处理 + """ + _items = storage_oper.list(_item) + if _items: + if not extensions: + return True + for t in _items: + if (t.type == "file" + and t.extension + and f".{t.extension.lower()}" in extensions): + return True + elif t.type == "dir": + return __any_file(t) + return False + + # 返回结果 + return __any_file(fileitem) def create_folder(self, fileitem: FileItem, name: str) -> Optional[FileItem]: """ diff --git a/app/monitor.py b/app/monitor.py index b1f200a9..b4fe221c 100644 --- a/app/monitor.py +++ b/app/monitor.py @@ -481,7 +481,13 @@ class Monitor(metaclass=Singleton): # 移动模式删除空目录 if transferinfo.transfer_type in ["move"]: logger.info(f"正在删除: {file_item.storage} {file_item.path}") - self.storagechain.delete_file(file_item) + if self.storagechain.delete_file(file_item): + # 删除空的父目录 + dir_item = self.storagechain.get_parent_item(file_item) + if dir_item: + if not self.storagechain.any_files(dir_item, extensions=settings.RMT_MEDIAEXT): + logger.warn(f"正在删除空目录: {dir_item.storage} {dir_item.path}") + return self.storagechain.delete_file(dir_item) except Exception as e: logger.error("目录监控发生错误:%s - %s" % (str(e), traceback.format_exc()))