You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

关键修改点

  1. 读取并解析保留列表:先读取specialfile.txt内容,按行分割后过滤空行、去重,生成保留文件名集合
  2. 保留特殊文件本身:将specialfile.txt加入保留列表,避免误删
  3. 判断逻辑调整:遍历目录时,仅删除不在保留列表中的文件/目录
  4. 增强错误处理:添加读取文件、目录的错误提示,删除失败时也会输出具体信息
  5. 可选配置: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:25:33