import json import os import xml.etree.ElementTree as ET """ FileUtils """ """ 文件操作 """ class FileUtils: # 初始化 configs.json 读取要用到的路径 def __init__(self): print("init FileUtils...") self.__configsChanged = False try: with open("configs.json", "r") as config_file: configs = json.load(config_file) paths = configs['paths'] # 关卡red文件夹 self.__redLevelConfigDir = paths["redreamLevelConfigDir"] # 关卡模板red文件夹 self.__redLevelTemplateDir = paths["redreamLevelTemplateDir"] # 盘子位置情况red文件夹 self.__plateConfigDir = paths["plateConfigDir"] # 关卡json文件夹 self.__jsonLevelConfigDir = paths["jsonLevelConfigDir"] except FileNotFoundError: print(f"文件{"configs.json"}不存在, 使用默认相关路径...") # 关卡red文件夹 self.__redLevelConfigDir = "/Users/red/ScrewGame/Resources/res_ScrewGame/关卡/" # 关卡模板red文件夹 self.__redLevelTemplateDir = "/Users/red/ScrewGame/Resources/res_ScrewGame/关卡/关卡模板/" # 盘子位置情况red文件夹 self.__plateConfigDir = "/Users/red/ScrewGame/Resources/res_ScrewGame/ccb/盘子上位置情况/" # 关卡json文件夹 self.__jsonLevelConfigDir = "/Users/red/ScrewGame/Resources/res_ScrewGame/config/最终关卡配置/" """ 展示当前默认路径和设置 提供修改的选项 """ def greet(self): print("Hello!") print(f"关卡red文件目录为{self.__redLevelConfigDir}") print(f"模板red文件目录为{self.__redLevelTemplateDir}") print(f"盘子位置情况red文件目录为{self.__plateConfigDir}") print(f"关卡json文件目录为{self.__jsonLevelConfigDir}") # TODO: 提供修改的选项 """ 将xml文件转化为python内置数据结构 """ def xml_to_py_object(self, root: ET.Element) -> str | dict | list | None: if root is None: return None root_tag = root.tag # print(root_tag) res_list = [] res_dict = {} if root_tag == 'dict': idx = 0 while idx < len(root): if root[idx].tag == 'key': next_tag = root[idx + 1].tag if next_tag == 'true': res_dict[root[idx].text] = True elif next_tag == 'false': res_dict[root[idx].text] = False else: res_dict[root[idx].text] = self.xml_to_py_object(root[idx + 1]) idx += 1 idx += 1 return res_dict elif root_tag == 'array': for child in root: res_list.append(self.xml_to_py_object(child)) return res_list else: return root.text """ 获得red(xml)文件的根 """ def get_root_of_red_file(self, file_path: str) -> ET.Element | None: if os.path.exists(file_path): return ET.parse(file_path).getroot()[0] else: print(f"{file_path}不存在!") return None """ 将字典写为json文件 """ def write_dict_to_json(self, dic: dict, path: str) -> None: with open(path, "w") as file: json.dump(dic, file) """ 退出时如果修改了默认相关参数 写入到文件中 """ def update_config_file(self): if self.__configsChanged: print("update config file...") configs = { "paths": { "redreamLevelConfigDir": self.__redLevelConfigDir, "redreamLevelTemplateDir": self.__redLevelTemplateDir, "plateConfigDir": self.__plateConfigDir, "jsonLevelConfigDir": self.__jsonLevelConfigDir }, "nScrewTypes": self.__nScrewTypes } self.write_dict_to_json(configs, "./configs.json") else: print("configs未被改变, 不做update") """ 将目录路径与关卡号组合在一起得到完整路径 """ def get_template_file_full_path(self, template_id_list: list) -> list: ret = [f"{self.__redLevelTemplateDir}{"模板"}{ID}{".red"}" for ID in template_id_list] return ret """ 将盘子ID和盘子上位置情况目录组合在一起得到完整路径 """ def get_plate_file_full_path(self, plate_configs_of_this_level: list) -> list: plate_id_list = [plate_config['plateId'] for plate_config in plate_configs_of_this_level] ret = [f"{self.__plateConfigDir}{"SG-盘子"}{ID}{"情况.red"}" for ID in plate_id_list] return ret """ 根据关卡号生成json文件的完整路径 """ def generate_level_json_file_full_path(self, level_id: str) -> str: ret = self.__jsonLevelConfigDir + f"关卡{level_id}.json" return ret """ 根据关卡red文件目录组合出文件的完整地址 """ def get_all_level_red_file_full_paths(self): ret = [] for file_name in os.listdir(self.__redLevelConfigDir): if file_name[-3:] == "red": ret.append(self.__redLevelConfigDir + file_name) return ret