fix #3042 移动模式删除空文件夹

This commit is contained in:
jxxghp
2024-11-09 18:23:08 +08:00
parent 9b2fccee01
commit 40b82d9cb6
4 changed files with 51 additions and 14 deletions

View File

@@ -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)
# 存在媒体文件,返回文件删除状态

View File

@@ -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} 个文件,"

View File

@@ -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]:
"""

View File

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