如何修改Node.js删除函数,保留指定列表文件中的文件而非仅保留列表文件
修改Node.js删除函数以保留指定文件列表
你的需求是保留specialfile.txt本身,同时保留该文件内列出的所有文件,删除目录下其他所有内容。可以按以下思路修改代码:
修改核心逻辑
- 先读取
specialfile.txt的内容,解析出需要保留的文件名列表 - 把
specialfile.txt本身加入保留列表,防止误删 - 遍历目标目录,判断每个文件/文件夹是否在保留列表中,不在则执行删除
修改后的回调风格代码
const fs = require('fs'); const path = require('path'); function Delete(dir) { log(`[DELETE] ${dir}.`); // 读取配置文件获取保留列表 fs.readFile(path.join(dir, 'specialfile.txt'), 'utf8', (readErr, data) => { if (readErr) { console.error('读取specialfile.txt失败:', readErr.message); return; } // 按行分割内容,过滤空行得到保留文件名数组 const keepFiles = data.split('\n').map(file => file.trim()).filter(Boolean); // 把配置文件本身加入保留列表 keepFiles.push('specialfile.txt'); // 读取目标目录内容 fs.readdir(dir, (dirErr, files) => { if (dirErr) { console.error('读取目录失败:', dirErr.message); return; } files.forEach(file => { const filePath = path.join(dir, file); // 不在保留列表则删除 if (!keepFiles.includes(file)) { fs.rm(filePath, { recursive: true, force: true }, (rmErr) => { if (rmErr) { console.error(`删除${filePath}失败:`, rmErr.message); } }); } }); }); }); }
更简洁的Async/Await版本(推荐)
如果你的Node.js版本支持Promise,用async/await可以避免回调嵌套,代码可读性更高:
const fs = require('fs').promises; const path = require('path'); async function Delete(dir) { log(`[DELETE] ${dir}.`); try { // 读取并解析保留列表 const data = await fs.readFile(path.join(dir, 'specialfile.txt'), 'utf8'); const keepFiles = data.split('\n').map(file => file.trim()).filter(Boolean); keepFiles.push('specialfile.txt'); // 遍历目录执行删除 const files = await fs.readdir(dir); for (const file of files) { const filePath = path.join(dir, file); if (!keepFiles.includes(file)) { await fs.rm(filePath, { recursive: true, force: true }); } } } catch (err) { console.error('操作失败:', err.message); } }
关键细节说明
- 过滤空行:
filter(Boolean)会去掉文件中可能存在的空行,避免无效的保留项 - force参数:添加
force: true可以避免删除不存在的文件时抛出错误,按需调整 - 错误捕获:每个异步操作都添加了错误处理,方便排查读取文件、删除文件时的问题
内容的提问来源于stack exchange,提问作者NeoHazuki
相关产品推荐
相关产品推荐

