FileUtils.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import json
  2. import os
  3. import xml.etree.ElementTree as ET
  4. """ FileUtils """
  5. """ 文件操作 """
  6. class FileUtils:
  7. # 初始化 configs.json 读取要用到的路径
  8. def __init__(self):
  9. print("init FileUtils...")
  10. self.__configsChanged = False
  11. try:
  12. with open("configs.json", "r") as config_file:
  13. configs = json.load(config_file)
  14. paths = configs['paths']
  15. # 关卡red文件夹
  16. self.__redLevelConfigDir = paths["redreamLevelConfigDir"]
  17. # 关卡模板red文件夹
  18. self.__redLevelTemplateDir = paths["redreamLevelTemplateDir"]
  19. # 盘子位置情况red文件夹
  20. self.__plateConfigDir = paths["plateConfigDir"]
  21. # 关卡json文件夹
  22. self.__jsonLevelConfigDir = paths["jsonLevelConfigDir"]
  23. except FileNotFoundError:
  24. print(f"文件{"configs.json"}不存在, 使用默认相关路径...")
  25. # 关卡red文件夹
  26. self.__redLevelConfigDir = "/Users/red/ScrewGame/Resources/res_ScrewGame/关卡/"
  27. # 关卡模板red文件夹
  28. self.__redLevelTemplateDir = "/Users/red/ScrewGame/Resources/res_ScrewGame/关卡/关卡模板/"
  29. # 盘子位置情况red文件夹
  30. self.__plateConfigDir = "/Users/red/ScrewGame/Resources/res_ScrewGame/ccb/盘子上位置情况/"
  31. # 关卡json文件夹
  32. self.__jsonLevelConfigDir = "/Users/red/ScrewGame/Resources/res_ScrewGame/config/最终关卡配置/"
  33. """ 展示当前默认路径和设置 提供修改的选项 """
  34. def greet(self):
  35. print("Hello!")
  36. print(f"关卡red文件目录为{self.__redLevelConfigDir}")
  37. print(f"模板red文件目录为{self.__redLevelTemplateDir}")
  38. print(f"盘子位置情况red文件目录为{self.__plateConfigDir}")
  39. print(f"关卡json文件目录为{self.__jsonLevelConfigDir}")
  40. # TODO: 提供修改的选项
  41. """ 将xml文件转化为python内置数据结构 """
  42. def xml_to_py_object(self, root: ET.Element) -> str | dict | list | None:
  43. if root is None:
  44. return None
  45. root_tag = root.tag
  46. # print(root_tag)
  47. res_list = []
  48. res_dict = {}
  49. if root_tag == 'dict':
  50. idx = 0
  51. while idx < len(root):
  52. if root[idx].tag == 'key':
  53. next_tag = root[idx + 1].tag
  54. if next_tag == 'true':
  55. res_dict[root[idx].text] = True
  56. elif next_tag == 'false':
  57. res_dict[root[idx].text] = False
  58. else:
  59. res_dict[root[idx].text] = self.xml_to_py_object(root[idx + 1])
  60. idx += 1
  61. idx += 1
  62. return res_dict
  63. elif root_tag == 'array':
  64. for child in root:
  65. res_list.append(self.xml_to_py_object(child))
  66. return res_list
  67. else:
  68. return root.text
  69. """ 获得red(xml)文件的根 """
  70. def get_root_of_red_file(self, file_path: str) -> ET.Element | None:
  71. if os.path.exists(file_path):
  72. return ET.parse(file_path).getroot()[0]
  73. else:
  74. print(f"{file_path}不存在!")
  75. return None
  76. """ 将字典写为json文件 """
  77. def write_dict_to_json(self, dic: dict, path: str) -> None:
  78. with open(path, "w") as file:
  79. json.dump(dic, file)
  80. """ 退出时如果修改了默认相关参数 写入到文件中 """
  81. def update_config_file(self):
  82. if self.__configsChanged:
  83. print("update config file...")
  84. configs = {
  85. "paths": {
  86. "redreamLevelConfigDir": self.__redLevelConfigDir,
  87. "redreamLevelTemplateDir": self.__redLevelTemplateDir,
  88. "plateConfigDir": self.__plateConfigDir,
  89. "jsonLevelConfigDir": self.__jsonLevelConfigDir
  90. },
  91. "nScrewTypes": self.__nScrewTypes
  92. }
  93. self.write_dict_to_json(configs, "./configs.json")
  94. else:
  95. print("configs未被改变, 不做update")
  96. """ 将目录路径与关卡号组合在一起得到完整路径 """
  97. def get_template_file_full_path(self, template_id_list: list) -> list:
  98. ret = [f"{self.__redLevelTemplateDir}{"模板"}{ID}{".red"}" for ID in template_id_list]
  99. return ret
  100. """ 将盘子ID和盘子上位置情况目录组合在一起得到完整路径 """
  101. def get_plate_file_full_path(self, plate_configs_of_this_level: list) -> list:
  102. plate_id_list = [plate_config['plateId'] for plate_config in plate_configs_of_this_level]
  103. ret = [f"{self.__plateConfigDir}{"SG-盘子"}{ID}{"情况.red"}" for ID in plate_id_list]
  104. return ret
  105. """ 根据关卡号生成json文件的完整路径 """
  106. def generate_level_json_file_full_path(self, level_id: str) -> str:
  107. ret = self.__jsonLevelConfigDir + f"关卡{level_id}.json"
  108. return ret
  109. """ 根据关卡red文件目录组合出文件的完整地址 """
  110. def get_all_level_red_file_full_paths(self):
  111. ret = []
  112. for file_name in os.listdir(self.__redLevelConfigDir):
  113. if file_name[-3:] == "red":
  114. ret.append(self.__redLevelConfigDir + file_name)
  115. return ret