以下是nodeschool learnyounode模块的练习5
创建一个程序,打印给定目录中的文件列表,并通过文件的扩展名进行筛选。您将获得一个目录名称作为程序的第一个目录(例如/path/to/dir/
)和一个作为第二个参数过滤的文件扩展名。
例如,如果您将'txt'作为第二个参数,则需要将列表过滤为仅以.txt
结尾的文件。
文件列表应打印到控制台,每行一个文件,并且必须使用异步I / O.
var fs = require('fs');
var path = require('path');
var mydir = process.argv[2];
var ext1 = process.argv[3]
fs.readdir(mydir, function(err, files){
if(err){
throw err
}
//console.log(files);
files.forEach(function(filename){
var ext = path.extname(filename);
if(ext == ext1){
console.log(filename);
}
});
});
当我运行这个时,我得到了正确的输出,但当我使用learnyounode验证输出实际结果与预期结果不匹配时
不知道我哪里出错了。有人可以给我解决方案PLZ ???
答案 0 :(得分:2)
你的问题只是一个错字。你这样做了:
if(ext == ext){ // you're comparing the same variable
console.log(filename);
}
,但你应该这样做:
if(ext === ext1){ // try to use '==='
console.log(filename);
}
其他事情:他们未考虑输入中.
的{{1}},因此您必须将此附加到变量.txt
中,因为ext1
会返回使用.extname(file)
:
.
答案 1 :(得分:2)
这是官方解决方案:
var fs = require('fs')
var path = require('path')
fs.readdir(process.argv[2], function (err, list) {
list.forEach(function (file) {
if (path.extname(file) === '.' + process.argv[3])
console.log(file)
})
})
答案 2 :(得分:0)
您可以尝试使用此代码来解决此问题:
var fs = require('fs');
function endsWith(str, suffix) {
var s = str.slice(str.length - suffix.length - 1);
if (s == "." + suffix)
return true;
else
return false;
};
fs.readdir(process.argv[2], function (err, list) {
if (process.argv[3]) {
for (var i = 0; i < list.length; i++) {
if (endsWith(list[i], process.argv[3]))
console.log(list[i]);
}
}
});
答案 3 :(得分:0)
以下是我提出的建议:
var fs = require('fs');
var filePath = process.argv[2];
var fileType = '.' + process.argv[3];
fs.readdir(filePath, function(err, list) {
for(var i=0; i<list.length; i++){
if (list[i].match(fileType)) {
console.log(list[i]);
}
}
});
答案 4 :(得分:0)
如果您想要解决问题的其他解决方案,请提供我想出的内容:
var fs = require('fs');
var path = process.argv[2]; //first argument
var extension = process.argv[3]; //second argument
var re = new RegExp("."+extension, "g"); //a regexp that matches every string that begins with a dot and is followed by the extension, i.e. .txt
fs.readdir(path, function callback(err, list){ //read the directory
if (!err) { //if no errors occur run next funtion
list.forEach(function(val) { //take the list and check every value with the statement below
if(re.test(val)) { //if the .test() rexexp-function does not match it will return a false, if it does it will return true
console.log(val); //if it matches console log the value
}
});
}
});
答案 5 :(得分:0)
代码中唯一缺少的是&#39;的连接。&#39;在文件扩展名类型之前。
var extension =&#39;。&#39; + process.argv [3];
然后,您可以进行比较和打印。
答案 6 :(得分:0)
这就是我如何解决它
var fs = require('fs');
const path = require("path")
var dir = process.argv[2],
ext = "."+process.argv[3];
function borer(callback){
fs.readdir(dir,function(err,list){
if(err){
console.log(err)
}else{
var row = list.filter((a)=>{
var regexp = new RegExp(ext+"$","ig")
if( a.search(regexp) > -1 ){
callback(a)
}
})
}
})
}
function print(f){
console.log(f)
}
borer(print)
答案 7 :(得分:0)
给出的解决方案使用Node JS包中的路径模块。下面的解决方案不使用路径,而是依赖于给定文件名的简单解构和使用所需的部分。
-Import fs module
var fs = require('fs');
- 从cmd行
中提取所需的路径和ext名称 let filePath = process.argv[2];
let extName = process.argv[3];
- 使用(readdir)方法读取目录的内容。目录中的文件名将以数组的形式返回。
fs.readdir(filePath, 'utf-8', function(err, data) {
if (err) throw err;
data.forEach(element => {
- 取每个元素并将其拆分为文件名和扩展名
let temp = element.split('.');
let tempSplit = temp[1];
if(tempSplit === extName) {
console.log(temp[0] + '.' + temp[1]);
}
});
整个代码供参考:
var fs = require('fs');
let filePath = process.argv[2];
let extName = process.argv[3];
fs.readdir(filePath, 'utf-8', function(err, data) {
if (err) throw err;
data.forEach(element => {
let temp = element.split('.');
let tempSplit = temp[1];
if(tempSplit === extName) {
console.log(temp[0] + '.' + temp[1]);
}
});