Nodejs 求大神看看那里出错了,目的是求一个目录下的所有文件中最大的文件,并输出出来它的文件名

Nodejs 求大神看看那里出错了,目的是求一个目录下的所有文件中最大的文件,并输出出来它的文件名

function largest(dir, callback) {
var results = ‘’;
fs.readdir(dir, function(err, list) {
if (err) {
return callback(null);
};

    var i = 0;
    (function next() {
        var file = list[i++];
        if (!file) return callback(null, results);
        file = dir + '/' + file;
        fs.stat(file, function(err, stat){
            if(stat && stat.isDirectory()) {
              largest(file, function(err, res){
                  next();
              })
            }else {
                var size = fs.stat(results, function(err, stat) {
                    if(err)
                        return 0;
                    else
                        return stat.size;
                })

                if (stat.size > size){
                    results = file;
                }
                next();
            };
        });
    })();
})

}

function callBack() { if(arguments[1] === null) console.log(‘Enter the path of illegal’); }

var arguments = process.argv.slice(2)[0];

largest(arguments, callBack());

求大神帮帮忙


3 回复

根据你提供的代码,有几个问题需要修正。首先,fs.stat 是异步的,所以不能直接用 fs.stat(results, function(err, stat) { ... }) 来获取文件大小并进行比较。其次,回调函数的使用也需要调整。以下是修正后的代码:

修改后的代码

const fs = require('fs');
const path = require('path');

function largest(dir, callback) {
    fs.readdir(dir, function(err, list) {
        if (err) {
            return callback(null, 'Enter the path of illegal');
        }

        let largestFile = '';
        let largestSize = 0;

        const next = () => {
            if (list.length === 0) {
                return callback(null, largestFile);
            }

            const file = list.shift();
            const filePath = path.join(dir, file);

            fs.stat(filePath, function(err, stat) {
                if (err) {
                    return next(); // 忽略错误继续处理下一个文件
                }

                if (stat.isDirectory()) {
                    largest(filePath, function(err, res) {
                        if (res) {
                            largestFile = res;
                            largestSize = fs.statSync(res).size;
                        }
                        next();
                    });
                } else {
                    if (stat.size > largestSize) {
                        largestFile = filePath;
                        largestSize = stat.size;
                    }
                    next();
                }
            });
        };

        next();
    });
}

function callback(err, result) {
    if (err) {
        console.error(err);
    } else {
        console.log(`The largest file is: ${result}`);
    }
}

// 获取命令行参数
const directoryPath = process.argv[2];

if (!directoryPath) {
    console.error('Please provide a directory path.');
} else {
    largest(directoryPath, callback);
}

解释

  1. 引入模块

    • fspath 模块被引入以处理文件系统操作和路径拼接。
  2. 定义 largest 函数

    • 使用 fs.readdir 读取指定目录中的所有文件和子目录。
    • 使用 next 函数递归地处理每个文件。
    • 如果文件是一个目录,则递归调用 largest 函数处理该目录。
    • 如果文件不是目录,则检查其大小是否大于当前记录的最大文件大小,如果是,则更新最大文件信息。
  3. 定义 callback 函数

    • 处理 largest 函数的回调结果,输出最大文件的路径。
  4. 处理命令行参数

    • 从命令行参数中获取要处理的目录路径,并调用 largest 函数。

这样修改后,代码应该能正确找到并输出指定目录下最大的文件。


代码没格式化, 帮改了… 大牛时间宝贵, 估计都不会帮楼主看… 帖一下报错吧, 或者描述下哪里出问题了, 也许刚好发现…

你的代码有一些逻辑错误。首先,你需要正确地获取当前文件的大小,而不是去获取 results 文件的大小。其次,递归调用需要确保所有子目录都处理完毕后才返回结果。最后,process.argv.slice(2) 应该直接传递给函数,而不是先赋值给变量。

以下是一个修正后的版本:

const fs = require('fs');
const path = require('path');

function largest(dir, callback) {
    fs.readdir(dir, function(err, list) {
        if (err) {
            return callback(null);
        }

        let results = { fileName: '', fileSize: 0 };
        
        const next = () => {
            if (list.length === 0) {
                return callback(null, results.fileName);
            }

            const file = list.shift();
            const filePath = path.join(dir, file);

            fs.stat(filePath, function(err, stat) {
                if (err) {
                    return next();
                }

                if (stat.isDirectory()) {
                    largest(filePath, function(err, res) {
                        next();
                    });
                } else {
                    if (stat.size > results.fileSize) {
                        results = { fileName: file, fileSize: stat.size };
                    }
                    next();
                }
            });
        };

        next();
    });
}

function callback(err, fileName) {
    if (err) {
        console.log('Enter the path of illegal');
    } else {
        console.log(`The largest file is ${fileName}`);
    }
}

largest(process.argv[2], callback);

解释:

  1. 引入依赖:导入 fspath 模块。
  2. 初始化结果对象:使用 { fileName: '', fileSize: 0 } 存储当前最大的文件信息。
  3. 读取目录:使用 fs.readdir 读取指定目录的所有文件和子目录。
  4. 递归遍历:使用 next 函数递归处理每个文件和子目录。
  5. 文件状态检查:使用 fs.stat 获取文件状态,判断是否为目录或文件,并更新最大文件信息。
  6. 回调处理:将最大文件名通过回调函数返回。

这样修改后,程序应该能够正确找到并输出指定目录下最大的文件名。

回到顶部