fix:修复一些BUG

This commit is contained in:
2025-12-11 17:52:39 +08:00
parent 4a5672ee62
commit ed4b324dba
11 changed files with 356 additions and 162 deletions

View File

@@ -2,14 +2,16 @@ import shutil
import os
import time
from loguru import logger
import zipfile
def export_data_folder(source_folder="data", output_folder="backup"):
def export_templates_folder(output_folder="backup"):
"""
将指定文件夹压缩为 zip 包
:param source_folder: 要压缩的文件夹路径 (默认 'data')
:param output_folder: 压缩包存放的文件夹路径 (默认 'backup')
"""
source_folder = "data"
try:
# 1. 检查源文件夹是否存在
if not os.path.exists(source_folder):
@@ -53,6 +55,76 @@ def export_data_folder(source_folder="data", output_folder="backup"):
logger.error(traceback.format_exc())
def export_data(save_dir, root_dir="."):
"""
导出 data 和 output 两个文件夹到同一个 zip 包中
:param save_dir: 用户在 GUI 弹窗中选择的保存目录 (例如: D:/Backup)
:param root_dir: 项目根目录 (用于找到 data 和 output)
"""
# 1. 定义要打包的目标文件夹
targets = ["data", "output"]
# 2. 检查保存目录
if not os.path.exists(save_dir):
logger.error(f"保存目录不存在: {save_dir}")
return
# 3. 生成压缩包路径
timestamp = time.strftime("%Y%m%d_%H%M%S")
zip_filename = f"完整备份_{timestamp}.zip"
zip_path = os.path.join(save_dir, zip_filename)
logger.info(f"开始备份,目标文件: {zip_path}")
try:
# 4. 创建压缩包 (使用 'w' 写入模式ZIP_DEFLATED 表示压缩)
with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
has_files = False # 标记是否真的压缩了文件
for target in targets:
target_abs_path = os.path.join(root_dir, target)
# 检查 data 或 output 是否存在
if not os.path.exists(target_abs_path):
logger.warning(f"⚠️ 跳过: 找不到文件夹 '{target}'")
continue
logger.info(f"正在压缩: {target} ...")
# 5. 遍历文件夹写入 ZIP
# os.walk 会递归遍历子文件夹
for root, dirs, files in os.walk(target_abs_path):
for file in files:
# 获取文件的绝对路径
file_abs_path = os.path.join(root, file)
# 【关键】计算在压缩包里的相对路径
# 例如: D:/Project/data/images/1.jpg -> data/images/1.jpg
arcname = os.path.relpath(file_abs_path, root_dir)
# 写入压缩包
zf.write(file_abs_path, arcname)
has_files = True
if has_files:
logger.success(f"✅ 备份成功! 文件已保存至:\n{zip_path}")
return zip_path
else:
logger.error("❌ 备份失败: data 和 output 文件夹均为空或不存在。")
# 如果生成了空文件,建议删除
if os.path.exists(zip_path):
os.remove(zip_path)
return None
except Exception as e:
logger.error(f"导出过程出错: {str(e)}")
import traceback
logger.error(traceback.format_exc())
def initialize_project(root_dir="."):
"""
初始化项目:清空 data重建目录复制模板