file_manager.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. # core/file_manager.py
  2. """文件管理器 - 统一管理 ~/.learningAgent/ 下的所有文件操作"""
  3. from pathlib import Path
  4. from datetime import datetime
  5. from typing import List
  6. from utils.exceptions import FileReadError, FileWriteError
  7. class FileManager:
  8. """
  9. 统一管理 ~/.learningAgent/ 下的所有文件操作
  10. Attributes:
  11. BASE_DIR: 基础目录路径
  12. """
  13. BASE_DIR = Path.home() / ".learningAgent"
  14. def __init__(self):
  15. """初始化文件管理器,确保基础目录存在"""
  16. self.ensure_structure()
  17. def ensure_structure(self) -> None:
  18. """确保基础目录结构存在"""
  19. self.BASE_DIR.mkdir(exist_ok=True)
  20. def create_domain(self, domain: str) -> None:
  21. """
  22. 创建新的学习领域目录
  23. Args:
  24. domain: 领域名称
  25. """
  26. domain_path = self.BASE_DIR / domain
  27. domain_path.mkdir(exist_ok=True)
  28. (domain_path / "knowledge").mkdir(exist_ok=True)
  29. (domain_path / "sessions").mkdir(exist_ok=True)
  30. # 创建空的 summary 文件
  31. (domain_path / "knowledge" / "knowledge_summary.md").write_text(
  32. "# 知识总结\n\n> 暂无知识笔记\n", encoding="utf-8"
  33. )
  34. (domain_path / "sessions" / "session_summary.md").write_text(
  35. "# 学习历程\n\n> 暂无学习记录\n", encoding="utf-8"
  36. )
  37. def save_plan(self, domain: str, plan_content: str) -> None:
  38. """
  39. 保存学习计划
  40. Args:
  41. domain: 领域名称
  42. plan_content: 计划内容(markdown格式)
  43. """
  44. plan_path = self.BASE_DIR / domain / "plan.md"
  45. try:
  46. plan_path.write_text(plan_content, encoding="utf-8")
  47. except Exception as e:
  48. raise FileWriteError(f"无法保存学习计划:{e}")
  49. def save_knowledge(self, domain: str, filename: str, content: str) -> None:
  50. """
  51. 保存知识笔记
  52. Args:
  53. domain: 领域名称
  54. filename: 文件名
  55. content: 文件内容
  56. """
  57. knowledge_path = self.BASE_DIR / domain / "knowledge" / filename
  58. try:
  59. knowledge_path.write_text(content, encoding="utf-8")
  60. except Exception as e:
  61. raise FileWriteError(f"无法保存知识笔记:{e}")
  62. def save_session(self, domain: str, session_content: str) -> Path:
  63. """
  64. 保存单次学习会话记录
  65. Args:
  66. domain: 领域名称
  67. session_content: 会话内容
  68. Returns:
  69. 保存的文件路径
  70. """
  71. date = datetime.now().strftime("%Y-%m-%d")
  72. time = datetime.now().strftime("%H-%M")
  73. session_path = self.BASE_DIR / domain / "sessions" / f"session_{date}_{time}.md"
  74. try:
  75. session_path.write_text(session_content, encoding="utf-8")
  76. except Exception as e:
  77. raise FileWriteError(f"无法保存会话记录:{e}")
  78. return session_path
  79. def read_plan(self, domain: str) -> str:
  80. """
  81. 读取学习计划
  82. Args:
  83. domain: 领域名称
  84. Returns:
  85. 计划内容
  86. Raises:
  87. FileNotFoundError: 如果计划不存在
  88. """
  89. plan_path = self.BASE_DIR / domain / "plan.md"
  90. if not plan_path.exists():
  91. raise FileNotFoundError(f"学习计划不存在:{domain}")
  92. try:
  93. return plan_path.read_text(encoding="utf-8")
  94. except Exception as e:
  95. raise FileReadError(f"无法读取学习计划:{e}")
  96. def domain_exists(self, domain: str) -> bool:
  97. """
  98. 检查领域是否存在
  99. Args:
  100. domain: 领域名称
  101. Returns:
  102. 是否存在
  103. """
  104. return (self.BASE_DIR / domain).exists()
  105. def list_domains(self) -> List[str]:
  106. """
  107. 列出所有学习领域
  108. Returns:
  109. 领域名称列表
  110. """
  111. if not self.BASE_DIR.exists():
  112. return []
  113. return [d.name for d in self.BASE_DIR.iterdir() if d.is_dir()]