Node.js运行时如何检测文件夹/文件是否被删除及重建?
Node.js运行时文件夹删除检测与自动重建方案
实时监听方案(推荐)
使用Node.js原生fs模块的watch方法直接监听目标目录,能第一时间捕获到目录被删除的事件:
const fs = require('fs'); const path = require('path'); const TARGET_DIR = path.resolve(__dirname, '你的目标目录路径'); // 启动时先初始化目录 async function initDir() { await fs.promises.mkdir(TARGET_DIR, { recursive: true, mode: 0o755 }); } // 启动目录监听 function watchDir() { const watcher = fs.watch(TARGET_DIR, (eventType) => { // 目录状态变更触发的事件回调 }); watcher.on('error', async (err) => { // 监听的目录被删除时会触发ENOENT错误 if (err.code === 'ENOENT') { console.log('目标目录被删除,正在重建...'); await initDir(); // 重建后重新启动监听 watcher.close(); watchDir(); } }); } // 启动逻辑 (async () => { await initDir(); watchDir(); })();
轮询兜底方案(兼容性更强)
如果你的运行环境是网络挂载盘、虚拟文件系统等fs.watch兼容不佳的场景,可以用定时轮询做兜底检测:
const fs = require('fs'); const path = require('path'); const TARGET_DIR = path.resolve(__dirname, '你的目标目录路径'); const CHECK_INTERVAL = 1000; // 检测间隔,单位毫秒,可根据需求调整 async function checkAndRebuildDir() { try { // 检测目录是否存在且可写入 await fs.promises.access(TARGET_DIR, fs.constants.W_OK); } catch (err) { if (err.code === 'ENOENT') { console.log('目标目录不存在,正在重建...'); await fs.promises.mkdir(TARGET_DIR, { recursive: true, mode: 0o755 }); } } } // 启动定时检测 setInterval(checkAndRebuildDir, CHECK_INTERVAL); // 启动时先初始化一次 checkAndRebuildDir();
写入操作必加保险逻辑
无论用哪种检测方案,都可能存在检测间隙目录被删除的情况,每次写入文件前都要加目录校验逻辑,直接用带recursive: true参数的mkdir即可,该方法原生兼容目录已存在的场景,不会抛出重复创建的错误:
async function writeDataToDir(filename, data) { const targetPath = path.join(TARGET_DIR, filename); // 写入前先确保目录存在 await fs.promises.mkdir(TARGET_DIR, { recursive: true }); // 再执行写入操作 await fs.promises.writeFile(targetPath, data); }
注意事项
- 不要单独依赖
fs.existsSync做写入前的校验,从检测到写入的时间差内目录仍有可能被删除,直接调用带recursive: true的mkdir安全性更高 - 生产环境建议将实时监听和轮询方案搭配使用,避免单方案失效导致的写入失败
- 如果目标目录有特殊权限要求,创建目录时可以传入
mode参数指定对应权限位
内容的提问来源于stack exchange,提问作者Coder2195
相关产品推荐
相关产品推荐

