From be058c6c80c000b1b91564e3bf4c646fa8480168 Mon Sep 17 00:00:00 2001 From: tianmo Date: Mon, 21 Sep 2026 10:06:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=96=87=E4=BB=B6=E5=85=9C?= =?UTF-8?q?=E5=BA=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../js/library-watcher.js | 20 ++++++++++++- SpineThumbnailGenerateServer/js/plugin.js | 7 +++-- .../tests/temp-cleanup.test.js | 28 +++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 SpineThumbnailGenerateServer/tests/temp-cleanup.test.js diff --git a/SpineThumbnailGenerateServer/js/library-watcher.js b/SpineThumbnailGenerateServer/js/library-watcher.js index 0432083..2b52311 100644 --- a/SpineThumbnailGenerateServer/js/library-watcher.js +++ b/SpineThumbnailGenerateServer/js/library-watcher.js @@ -16,6 +16,24 @@ const QUIET_MS = 1000; // fs.watch 在网络盘/外置盘上可能漏事件,用低频兜底扫描补上。 const FALLBACK_MS = 30000; +/** 删除指定目录中超过保留时间的本插件临时文件。 */ +function cleanupStaleFiles(directory, prefix, maxAgeMs, now = Date.now()) { + let names; + try { names = fs.readdirSync(directory); } catch (error) { return 0; } + let removed = 0; + for (const name of names) { + if (!name.startsWith(prefix)) continue; + const file = path.join(directory, name); + try { + const stat = fs.lstatSync(file); + if (!stat.isFile() || now - stat.mtimeMs < maxAgeMs) continue; + fs.unlinkSync(file); + removed += 1; + } catch (error) { /* 单个文件失败不影响其余清理和监听 */ } + } + return removed; +} + function createLibraryWatcher(options) { const onBatch = options.onBatch || (() => {}); const onLog = options.onLog || (() => {}); @@ -94,7 +112,7 @@ function createLibraryWatcher(options) { // 同时支持两种加载方式:Node 里用 require(跑测试),插件页面里用