优化epub清理逻辑

This commit is contained in:
DelLevin-Home
2026-07-03 01:50:13 +08:00
parent 25d2efda6a
commit a39c93cda3

View File

@@ -2173,29 +2173,40 @@ class _SettingsPageState extends State<SettingsPage> {
int deletedCount = 0; int deletedCount = 0;
try { try {
final db = await DatabaseHelper.instance.database; final db = await DatabaseHelper.instance.database;
// 收集数据库中所有引用的 epub_books 子目录名 // 收集数据库中所有引用的 epub_books 子目录名(包括软删除的)
final rows = await db final rows = await db
.query('reader_books', columns: ['id', 'file_path', 'cover_path']); .query('reader_books', columns: ['id', 'file_path', 'cover_path', 'is_deleted']);
final usedDirs = <String>{}; final usedDirs = <String>{};
for (final r in rows) { for (final r in rows) {
// 只收集未删除的记录对应的目录
final isDeleted = r['is_deleted'] == 1 || r['is_deleted'] == true;
if (isDeleted) continue;
final id = r['id'] as String?; final id = r['id'] as String?;
if (id != null && id.isNotEmpty) usedDirs.add(id); if (id != null && id.isNotEmpty) usedDirs.add(id);
_collectEpubDirName(r['file_path'] as String?, usedDirs); _collectEpubDirName(r['file_path'] as String?, usedDirs);
_collectEpubDirName(r['cover_path'] as String?, usedDirs); _collectEpubDirName(r['cover_path'] as String?, usedDirs);
} }
// 检查 /data/user/0/top.iletter.mooknote/app_flutter/epub_books 路径
final appDir = await getApplicationDocumentsDirectory(); final appDir = await getApplicationDocumentsDirectory();
final epubDir = Directory('${appDir.path}/epub_books'); final possiblePaths = [
if (!await epubDir.exists()) return 0; '${appDir.path}/epub_books',
'/data/user/0/top.iletter.mooknote/app_flutter/epub_books',
];
await for (final entity in epubDir.list(followLinks: false)) { for (final epubPath in possiblePaths) {
if (entity is Directory) { final epubDir = Directory(epubPath);
final dirName = path.basename(entity.path); if (!await epubDir.exists()) continue;
if (!usedDirs.contains(dirName)) {
try { await for (final entity in epubDir.list(followLinks: false)) {
await entity.delete(recursive: true); if (entity is Directory) {
deletedCount++; final dirName = path.basename(entity.path);
} catch (_) {} if (!usedDirs.contains(dirName)) {
try {
await entity.delete(recursive: true);
deletedCount++;
} catch (_) {}
}
} }
} }
} }