config_editor/file_handler.py

117 lines
4.7 KiB
Python
Raw Normal View History

2026-01-19 08:01:13 +00:00
'''文件读写管理模块'''
import os
import json
import shutil
from pathlib import Path
from typing import Dict, Any
from utils import (backup_existing_rules, merge_rules,
get_default_rules, ensure_rule_structure)
class FileHandler:
"""文件处理器"""
def __init__(self, program_dir: str):
self.program_dir = program_dir
self.rules_file = str(Path(program_dir) / "config_editor_rules.json")
self.settings_file = str(Path(program_dir) / "config_editor_settings.json")
def load_user_settings(self) -> Dict:
"""加载用户设置"""
try:
if os.path.exists(self.settings_file):
with open(self.settings_file, 'r', encoding='utf-8') as f:
return json.load(f)
except Exception as e:
print(f"加载用户设置失败: {e}")
return {}
def save_user_settings(self, settings: Dict) -> bool:
"""保存用户设置"""
try:
with open(self.settings_file, 'w', encoding='utf-8') as f:
json.dump(settings, f, indent=2, ensure_ascii=False)
return True
except Exception as e:
print(f"保存用户设置失败: {e}")
return False
def load_rules(self) -> Dict:
"""加载规则文件"""
try:
# 先备份现有规则文件
backup_existing_rules(self.rules_file, self.program_dir)
# 检查是否已有规则文件
if os.path.exists(self.rules_file):
with open(self.rules_file, 'r', encoding='utf-8') as f:
existing_rules = json.load(f)
# 检查规则文件是否为空或格式错误
if not existing_rules or not isinstance(existing_rules, dict):
raise ValueError("规则文件为空或格式错误")
# 从打包资源加载默认规则(用于合并新字段)
default_rules = get_default_rules()
# 智能合并:保留现有规则,只添加新字段
rules = merge_rules(existing_rules, default_rules)
# 确保规则结构完整
rules = ensure_rule_structure(rules)
# 保存合并后的规则(包含新字段)
self.save_rules(rules)
return rules
else:
# 如果没有规则文件,使用默认规则
rules = get_default_rules()
# 确保规则结构完整
rules = ensure_rule_structure(rules)
# 首次运行,创建规则文件
try:
self.save_rules(rules)
except Exception as e:
print(f"创建规则文件失败: {e}")
return rules
except (json.JSONDecodeError, ValueError, KeyError) as e:
# 如果规则文件损坏,备份后使用默认规则
print(f"加载规则文件失败: {e},将使用默认规则")
self._backup_corrupted_rules()
rules = get_default_rules()
rules = ensure_rule_structure(rules)
self.save_rules(rules)
return rules
except Exception as e:
print(f"加载规则文件失败: {e}")
rules = get_default_rules()
rules = ensure_rule_structure(rules)
return rules
def save_rules(self, rules: Dict) -> bool:
"""保存规则文件"""
try:
# 确保规则结构完整
rules = ensure_rule_structure(rules)
with open(self.rules_file, 'w', encoding='utf-8') as f:
json.dump(rules, f, indent=2, ensure_ascii=False)
return True
except Exception as e:
print(f"保存规则文件失败: {e}")
return False
def _backup_corrupted_rules(self):
"""备份损坏的规则文件"""
if os.path.exists(self.rules_file):
import datetime
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
backup_file = f"{self.rules_file}.corrupted_{timestamp}.bak"
try:
shutil.copy2(self.rules_file, backup_file)
print(f"已备份损坏的规则文件到: {backup_file}")
except Exception as e:
print(f"备份损坏规则文件失败: {e}")