fix #2265 优化硬链接的判断逻辑
This commit is contained in:
parent
a7a06a9a75
commit
7be262b182
@ -360,11 +360,11 @@ class TransferChain(ChainBase):
|
|||||||
# 硬链接检查
|
# 硬链接检查
|
||||||
temp_transfer_type = transfer_type
|
temp_transfer_type = transfer_type
|
||||||
if transfer_type == "link":
|
if transfer_type == "link":
|
||||||
if not SystemUtils.is_same_file(file_path, transferinfo.target_path):
|
if not SystemUtils.is_hardlink(file_path, transferinfo.target_path):
|
||||||
logger.warn(
|
logger.warn(
|
||||||
f"{file_path} 与 {transferinfo.target_path} 不是同一硬链接文件,请检查存储空间占用和整理耗时,确认是否为复制")
|
f"{file_path} 与 {transferinfo.target_path} 不是同一硬链接文件路径,请检查存储空间占用和整理耗时,确认是否为复制")
|
||||||
self.messagehelper.put(
|
self.messagehelper.put(
|
||||||
f"{file_path} 与 {transferinfo.target_path} 不是同一硬链接文件,疑似硬链接失败,请检查是否为复制",
|
f"{file_path} 与 {transferinfo.target_path} 不是同一硬链接文件路径,疑似硬链接失败,请检查是否为复制",
|
||||||
title="硬链接失败",
|
title="硬链接失败",
|
||||||
role="system")
|
role="system")
|
||||||
temp_transfer_type = "copy"
|
temp_transfer_type = "copy"
|
||||||
|
@ -125,7 +125,7 @@ class SystemUtils:
|
|||||||
tmp_path.unlink()
|
tmp_path.unlink()
|
||||||
tmp_path.hardlink_to(src)
|
tmp_path.hardlink_to(src)
|
||||||
# 硬链接完成,移除 .mp 后缀
|
# 硬链接完成,移除 .mp 后缀
|
||||||
tmp_path.rename(dest)
|
shutil.move(tmp_path, dest)
|
||||||
return 0, ""
|
return 0, ""
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
print(str(err))
|
print(str(err))
|
||||||
@ -468,11 +468,28 @@ class SystemUtils:
|
|||||||
return False, f"重启时发生错误:{str(err)}"
|
return False, f"重启时发生错误:{str(err)}"
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def is_same_file(src: Path, dest: Path) -> bool:
|
def is_hardlink(src: Path, dest: Path) -> bool:
|
||||||
"""判断是否为同一个文件"""
|
"""判断是否为硬链接"""
|
||||||
|
try:
|
||||||
if not src.exists() or not dest.exists():
|
if not src.exists() or not dest.exists():
|
||||||
return False
|
return False
|
||||||
|
if src.is_file():
|
||||||
|
# 如果是文件,直接比较文件
|
||||||
return src.samefile(dest)
|
return src.samefile(dest)
|
||||||
|
else:
|
||||||
|
for src_file in src.glob("**/*"):
|
||||||
|
if src_file.is_dir():
|
||||||
|
continue
|
||||||
|
# 计算目标文件路径
|
||||||
|
relative_path = src_file.relative_to(src)
|
||||||
|
target_file = dest.joinpath(relative_path)
|
||||||
|
# 检查是否是硬链接
|
||||||
|
if not target_file.exists() or not src_file.samefile(target_file):
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
except (PermissionError, FileNotFoundError, ValueError, OSError) as e:
|
||||||
|
print(f"Error occurred: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def is_same_disk(src: Path, dest: Path) -> bool:
|
def is_same_disk(src: Path, dest: Path) -> bool:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user