基于SQLite3+PySide6的本地文件夹索引数据库优化方案问询
优化两级文件夹索引工具的本地文件系统与数据库同步方案
针对你的两级文件夹索引工具(folderlevel1 + folderlevel2),结合PySide6和SQLite3的技术栈,以下是几个比启动全量扫描更优雅的同步方案:
1. 实时文件系统监控(推荐)
利用PySide6内置的QFileSystemWatcher组件,直接监控所有folderlevel1目录的变化,一旦外部操作(删除、新增二级文件夹)触发目录变更信号,立即同步数据库,无需全量扫描。
实现步骤:
- 初始化
QFileSystemWatcher,将所有已存入数据库的folderlevel1路径添加到监控列表; - 绑定
directoryChanged信号到自定义处理函数,当某个folderlevel1目录发生变化时:- 扫描该folderlevel1下所有实际存在的folderlevel2路径;
- 从数据库中查询该folderlevel1对应的所有key2记录;
- 对比两组路径:
- 本地存在但数据库没有的路径:执行
INSERT语句新增记录; - 数据库存在但本地已删除的路径:执行
DELETE语句移除记录;
- 本地存在但数据库没有的路径:执行
- 若有新添加的folderlevel1目录(应用内操作),同步将其加入监控列表。
代码示例片段:
import os from PySide6.QtCore import QFileSystemWatcher # 初始化监控器 self.watcher = QFileSystemWatcher() # 从数据库加载所有folderlevel1路径并添加监控 folder_level1_list = [row[0] for row in self.db.execute("SELECT DISTINCT folderlevel1 FROM your_table")] self.watcher.addPaths(folder_level1_list) # 绑定信号 self.watcher.directoryChanged.connect(self.sync_folder_level2) def sync_folder_level2(self, dir_path): # 扫描本地当前folderlevel1下的二级文件夹 local_level2 = [os.path.join(dir_path, d) for d in os.listdir(dir_path) if os.path.isdir(os.path.join(dir_path, d))] # 从数据库获取该folderlevel1对应的二级路径 db_level2 = [row[0] for row in self.db.execute("SELECT folderlevel2 FROM your_table WHERE folderlevel1 = ?", (dir_path,))] # 新增本地有但数据库没有的记录 for path in local_level2: if path not in db_level2: self.db.execute("INSERT INTO your_table (folderlevel1, folderlevel2) VALUES (?, ?)", (dir_path, path)) # 删除数据库有但本地已删除的记录 for path in db_level2: if path not in local_level2: self.db.execute("DELETE FROM your_table WHERE folderlevel2 = ?", (path,)) self.db.commit()
2. 增量定时扫描
如果不想用实时监控,可改用增量扫描替代全量启动扫描,只针对有更新痕迹的目录同步:
- 在数据库表中添加
last_sync_time字段,记录每条folderlevel1记录的最后同步时间; - 启动时或定时(比如每10分钟)遍历folderlevel1目录,对比目录的
mtime(修改时间)与last_sync_time:- 若目录修改时间晚于同步时间,才扫描该目录下的folderlevel2并同步数据库;
- 同步完成后更新该folderlevel1的
last_sync_time为当前时间。
这种方案比全量扫描高效,实现成本低,适合对实时性要求不高的自用场景。
3. 数据库与文件系统的双向绑定兜底
针对应用内的操作,确保数据库操作与文件系统操作同步(比如删除数据库记录时同时删除对应本地文件夹,新增记录时确保本地文件夹存在);对于外部操作,用上述两种方案覆盖,形成完整的同步闭环。
内容的提问来源于stack exchange,提问作者Aldert Kaivohault
相关产品推荐
相关产品推荐

