You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
3.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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,
}