#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 文件操作模块 处理文件保存和相关操作 """ import os from pathlib import Path from mod_tpl import expand_filename_template class FileSaveError(Exception): """文件保存错误异常""" pass def validate_save_params(content, filename_template, folder, ext): """验证保存参数""" if not content or not content.strip(): raise FileSaveError("内容为空,无法保存!") if not filename_template or not filename_template.strip(): raise FileSaveError("文件名不能为空!") if not folder or not folder.strip(): raise FileSaveError("保存目录不能为空!") if not ext or not ext.strip(): raise FileSaveError("文件扩展名不能为空!") def ensure_directory_exists(directory): """确保目录存在""" try: Path(directory).mkdir(parents=True, exist_ok=True) except Exception as e: raise FileSaveError(f"创建目录失败: {str(e)}") def build_file_path(filename_template, folder, ext): """构建完整文件路径""" # 展开文件名模板 filename = expand_filename_template(filename_template) # 确保扩展名以点开头 if not ext.startswith('.'): ext = '.' + ext # 文件名和扩展名合成最终文件名 full_filename = filename + ext # 构建完整路径 filepath = os.path.join(folder, full_filename) return filepath def check_file_exists(filepath): """检查文件是否存在""" return os.path.exists(filepath) def save_note_content(content, filename_template, folder, ext, overwrite_callback=None): """ 保存笔记内容到文件 Args: content: 要保存的内容 filename_template: 文件名模板 folder: 保存目录 ext: 文件扩展名 overwrite_callback: 文件存在时的回调函数,返回True表示覆盖 Returns: str: 保存的文件路径 Raises: FileSaveError: 保存失败时抛出异常 """ try: # 验证参数 validate_save_params(content, filename_template, folder, ext) # 确保目录存在 ensure_directory_exists(folder) # 构建文件路径 filepath = build_file_path(filename_template, folder, ext) # 检查文件是否已存在 if check_file_exists(filepath): if overwrite_callback: if not overwrite_callback(filepath): raise FileSaveError("用户取消保存操作") else: raise FileSaveError(f"文件 {filepath} 已存在") # 保存文件 with open(filepath, 'w', encoding='utf-8') as f: f.write(content) return filepath except FileSaveError: raise except Exception as e: raise FileSaveError(f"保存失败: {str(e)}") def get_file_info(filepath): """获取文件信息""" if not os.path.exists(filepath): return None stat = os.stat(filepath) return { 'size': stat.st_size, 'modified': stat.st_mtime, 'created': stat.st_ctime, }