From 72ba98700c68a46029fc9eaccd1fdc28f5aa4ab0 Mon Sep 17 00:00:00 2001 From: kjqwer <2990346238@qq.com> Date: Fri, 21 Nov 2025 15:32:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=87=E4=BB=B6=E5=90=8D?= =?UTF-8?q?=E5=90=8E=E7=BC=80=E4=BD=8D=E7=BD=AE=E4=B8=8D=E5=AF=B9=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SmartSaveImage/core/path_utils.py | 44 ++++++++++++++++----------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/src/SmartSaveImage/core/path_utils.py b/src/SmartSaveImage/core/path_utils.py index ceed339..82c28c1 100644 --- a/src/SmartSaveImage/core/path_utils.py +++ b/src/SmartSaveImage/core/path_utils.py @@ -197,26 +197,34 @@ class PathManager: def generate_unique_filename(self, directory: str, base_filename: str, extension: str, overwrite: bool = False) -> str: - """生成唯一的文件名(如果文件已存在且不允许覆盖)""" filename = f"{base_filename}{extension}" filepath = os.path.join(directory, filename) - if not os.path.exists(filepath) or overwrite: return filename - - # 生成唯一文件名 - counter = 1 - while True: - new_filename = f"{base_filename}_{counter:03d}{extension}" - new_filepath = os.path.join(directory, new_filename) - if not os.path.exists(new_filepath): - return new_filename - counter += 1 - - # 防止无限循环 - if counter > 9999: - break - - # 如果还是冲突,使用时间戳 - timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:17] # 精确到毫秒 + m = re.match(r"^(.*)_(\d+)$", base_filename) + if m: + root = m.group(1) + num_str = m.group(2) + padding = len(num_str) + try: + num = int(num_str) + except ValueError: + num = 1 + while True: + num += 1 + new_filename = f"{root}_{str(num).zfill(padding)}{extension}" + if not os.path.exists(os.path.join(directory, new_filename)): + return new_filename + if num > 9999999: + break + else: + counter = 1 + while True: + new_filename = f"{base_filename}_{counter:03d}{extension}" + if not os.path.exists(os.path.join(directory, new_filename)): + return new_filename + counter += 1 + if counter > 9999999: + break + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:17] return f"{base_filename}_{timestamp}{extension}"