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);
}
解释
-
引入模块:
fs
和path
模块被引入以处理文件系统操作和路径拼接。
-
定义
largest
函数:- 使用
fs.readdir
读取指定目录中的所有文件和子目录。 - 使用
next
函数递归地处理每个文件。 - 如果文件是一个目录,则递归调用
largest
函数处理该目录。 - 如果文件不是目录,则检查其大小是否大于当前记录的最大文件大小,如果是,则更新最大文件信息。
- 使用
-
定义
callback
函数:- 处理
largest
函数的回调结果,输出最大文件的路径。
- 处理
-
处理命令行参数:
- 从命令行参数中获取要处理的目录路径,并调用
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);
解释:
- 引入依赖:导入
fs
和path
模块。 - 初始化结果对象:使用
{ fileName: '', fileSize: 0 }
存储当前最大的文件信息。 - 读取目录:使用
fs.readdir
读取指定目录的所有文件和子目录。 - 递归遍历:使用
next
函数递归处理每个文件和子目录。 - 文件状态检查:使用
fs.stat
获取文件状态,判断是否为目录或文件,并更新最大文件信息。 - 回调处理:将最大文件名通过回调函数返回。
这样修改后,程序应该能够正确找到并输出指定目录下最大的文件名。