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()))