Files
iot-interphone/ConfigManager.py

200 lines
6.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import ujson
import uos
class ConfigManager:
def __init__(self, config_dir="configs"):
"""
初始化配置管理器
:param config_dir: 配置文件存储的目录
"""
self.config_dir = config_dir
self._ensure_dir_exists(config_dir)
def _ensure_dir_exists(self, directory):
"""
确保目录存在,如果不存在则创建
:param directory: 目录路径
"""
try:
uos.listdir(directory) # 尝试列出目录内容
except OSError:
uos.mkdir(directory) # 如果目录不存在,则创建
def _get_file_path(self, root_key):
"""
根据根键生成配置文件路径
:param root_key: 配置的根键(如 'system'
:return: 配置文件路径
"""
return f"{self.config_dir}/{root_key}.conf"
def _load_config(self, root_key):
"""
加载配置文件内容
:param root_key: 配置的根键
:return: 配置字典
"""
file_path = self._get_file_path(root_key)
try:
with open(file_path, "r") as f:
return ujson.load(f)
except (OSError, ValueError):
return {}
def _save_config(self, root_key, config):
"""
保存配置到文件
:param root_key: 配置的根键
:param config: 配置字典
"""
file_path = self._get_file_path(root_key)
with open(file_path, "w") as f:
ujson.dump(config, f)
def set(self, key, value):
"""
设置配置值
:param key: 配置键,使用点分割(如 'system.wifi.name'
:param value: 配置值
"""
keys = key.split(".")
if len(keys) < 2:
raise ValueError("Key must contain at least one dot (e.g., 'system.wifi.name')")
root_key = keys[0]
sub_keys = keys[1:]
config = self._load_config(root_key)
current = config
for sub_key in sub_keys[:-1]:
if sub_key not in current or not isinstance(current[sub_key], dict):
current[sub_key] = {}
current = current[sub_key]
current[sub_keys[-1]] = value
self._save_config(root_key, config)
def get(self, key, default=None):
"""
获取配置值
:param key: 配置键,使用点分割(如 'system.wifi.name'
:param default: 默认值,如果键不存在则返回
:return: 配置值或默认值
"""
keys = key.split(".")
if len(keys) < 2:
raise ValueError("Key must contain at least one dot (e.g., 'system.wifi.name')")
root_key = keys[0]
sub_keys = keys[1:]
config = self._load_config(root_key)
current = config
for sub_key in sub_keys:
if sub_key in current:
current = current[sub_key]
else:
return default
return current
def delete(self, key):
"""
删除配置键
:param key: 配置键,使用点分割(如 'system.wifi.name'
"""
keys = key.split(".")
if len(keys) < 2:
raise ValueError("Key must contain at least one dot (e.g., 'system.wifi.name')")
root_key = keys[0]
sub_keys = keys[1:]
config = self._load_config(root_key)
current = config
for sub_key in sub_keys[:-1]:
if sub_key in current and isinstance(current[sub_key], dict):
current = current[sub_key]
else:
return # Key does not exist, nothing to delete
if sub_keys[-1] in current:
del current[sub_keys[-1]]
self._save_config(root_key, config)
def clear(self, root_key):
"""
清空某个根键的配置文件
:param root_key: 配置的根键(如 'system'
"""
file_path = self._get_file_path(root_key)
try:
uos.remove(file_path)
except OSError:
pass
def append_to_list(self, key, value, append_to_end=True):
"""
在指定字典的列表值中追加数据
:param key: 配置键,使用点分割(如 'system.wifi.list'
:param value: 要追加的数据
:param append_to_end: 是否追加到列表末尾,默认为 True如果为 False则追加到开头
"""
keys = key.split(".")
if len(keys) < 2:
raise ValueError("Key must contain at least one dot (e.g., 'system.wifi.list')")
root_key = keys[0]
sub_keys = keys[1:]
config = self._load_config(root_key)
current = config
for sub_key in sub_keys[:-1]:
if sub_key not in current or not isinstance(current[sub_key], dict):
current[sub_key] = {}
current = current[sub_key]
list_key = sub_keys[-1]
if list_key not in current or not isinstance(current[list_key], list):
current[list_key] = []
if append_to_end:
current[list_key].append(value)
else:
current[list_key].insert(0, value)
self._save_config(root_key, config)
def remove_from_list(self, key, value):
"""
从指定字典的列表值中删除数据
:param key: 配置键,使用点分割(如 'system.wifi.list'
:param value: 要删除的数据
"""
keys = key.split(".")
if len(keys) < 2:
raise ValueError("Key must contain at least one dot (e.g., 'system.wifi.list')")
root_key = keys[0]
sub_keys = keys[1:]
config = self._load_config(root_key)
current = config
for sub_key in sub_keys[:-1]:
if sub_key not in current or not isinstance(current[sub_key], dict):
current[sub_key] = {}
current = current[sub_key]
list_key = sub_keys[-1]
if list_key in current and isinstance(current[list_key], list):
try:
current[list_key].remove(value)
except ValueError:
pass
self._save_config(root_key, config)