Node.js需求:除指定文件列表外删除目录下所有文件
修改方案
回调风格(保持原代码结构)
先读取specialfile.txt获取需保留的文件列表,再遍历目录判断是否删除:
const fs = require('fs'); const path = require('path'); function Delete(dir) { log(`[DELETE] ${dir}.`); const specialFilePath = path.join(dir, 'specialfile.txt'); // 读取specialfile.txt获取保留文件列表 fs.readFile(specialFilePath, 'utf8', (err, data) => { if (err) { console.error('读取specialfile.txt失败:', err.message); return; } // 解析内容,生成去重后的保留文件名集合,同时保留specialfile.txt本身 const keepFiles = new Set( data.split('\n') .map(line => line.trim()) .filter(line => line) ); keepFiles.add('specialfile.txt'); // 遍历目标目录文件 fs.readdir(dir, (err, files) => { if (err) { console.error('读取目录失败:', err.message); return; } files.forEach(file => { const fileDir = path.join(dir, file); // 不在保留列表中的文件/目录执行删除 if (!keepFiles.has(file)) { fs.rm(fileDir, { recursive: true, force: true }, (err) => { if (err) { console.error(`删除${fileDir}失败:`, err.message); return; } }); } }); }); }); }
Async-Await风格(更简洁易读,避免回调嵌套)
推荐使用Promise版本的fs模块,配合async-await优化代码结构:
const fs = require('fs').promises; const path = require('path'); async function Delete(dir) { log(`[DELETE] ${dir}.`); const specialFilePath = path.join(dir, 'specialfile.txt'); try { // 读取并解析保留文件列表 const data = await fs.readFile(specialFilePath, 'utf8'); const keepFiles = new Set( data.split('\n') .map(line => line.trim()) .filter(line => line) ); keepFiles.add('specialfile.txt'); // 获取目录下所有文件 const files = await fs.readdir(dir); // 逐个判断并删除非保留项 for (const file of files) { const fileDir = path.join(dir, file); if (!keepFiles.has(file)) { await fs.rm(fileDir, { recursive: true, force: true }); } } } catch (err) { console.error('操作失败:', err.message); } }
关键修改点
- 读取并解析保留列表:先读取
specialfile.txt内容,按行分割后过滤空行、去重,生成保留文件名集合 - 保留特殊文件本身:将
specialfile.txt加入保留列表,避免误删 - 判断逻辑调整:遍历目录时,仅删除不在保留列表中的文件/目录
- 增强错误处理:添加读取文件、目录的错误提示,删除失败时也会输出具体信息
- 可选配置:
fs.rm的force: true参数用于避免因文件不存在抛出错误,可根据需求移除
额外说明
- 文件名匹配区分大小写(如Linux系统),确保
specialfile.txt中的文件名与目录中实际文件名完全一致 - 如果需要仅删除文件、保留空目录,可在删除前通过
fs.lstat判断文件类型,仅删除文件类型项:
// 回调风格中添加文件类型判断 files.forEach(file => { const fileDir = path.join(dir, file); if (!keepFiles.has(file)) { fs.lstat(fileDir, (err, stats) => { if (err) { console.error(`获取文件信息失败:`, err.message); return; } // 仅删除文件,跳过目录 if (stats.isFile()) { fs.rm(fileDir, { force: true }, (err) => { if (err) console.error(`删除${fileDir}失败:`, err.message); }); } }); } });
内容的提问来源于stack exchange,提问作者NeoHazuki
相关产品推荐
相关产品推荐

