这里我们需要fs模块
var fs = require("fs");
fs模块允许我们使用Stream API来对数据进行读写操作。与readFile和writeFile方法不一样,他对内的分配不是一次完成的。
var fs = require("fs");
var stdout = process.stdout;//先将输入输出保存在变量里面
var stdin = process.stdin;
var stats = [];
fs.readdir(__dirname, function (err, files) {//读取文件所在的文件夹,files是指获取到的所有文件
console.log('');
if (!files.length) {//如果没有文件
return console.log('\033[31m No files to show!\033[39m\n');
}
console.log(" Select which file or directory you want to see\n");
function file(i) {//对每个文件进行操作
var filename = files[i];
fs.stat(__dirname + '/' + filename, function (err, stat) {//stat会给出文件或者目录的元数据
stats[i] = stat;//将每个文件对应的stat对象保存起来
if (stat.isDirectory()) {//如果stat是一个文件夹的话
console.log(' ' + i + ' \033[31m/' + filename + '\033[39m');
}
else {//否则就是文件
console.log(' ' + i + ' \033[90m' + filename + '\033[39m')
}
i++;
if (i == files.length) {//如果所有文件都循环变了
console.log('');
read();//那就开始输入序号
} else {
file(i);//递归,把每个文件都遍历
}
})
}
function read() {
console.log('');
stdout.write('\033[33m Enter your choice:\033[39m');
stdin.resume();//开始输入数据
stdin.setEncoding('utf8');//统一编码
stdin.on('data', option);//监听输入数据,回车键结束回调函数
}
function option(data) {
var filename = files[Number(data)];//记录选择的文件序号
if (!filename) {//如果不存在这个文件
stdout.write(' \033[33m Enter your choice:\033[39m');
}
else {
stdin.pause();//暂停流,退出程序
console.log(data);//打印出序号
if (stats[Number(data)].isDirectory()) {//如果这是一个文件夹的话
fs.readdir(__dirname + '/' + filename, function (err, files) {//继续读取文件夹的信息
console.log('');
console.log(' (' + files.length + ' files');
files.forEach(function (file) {
console.log(' - ' + file);
});
console.log('');
});
} else {
fs.readFile(__dirname + '/' + filename, 'utf8', function (err, data) {//否则就读取文件内容
console.log('');
console.log('\033[90m' + data.replace(/(.*)/g, ' $1') + '\033[39m');
});
}
}
}
file(0);//第一次调用函数
})
1.这里面有个stdin.pause(),如果没有这条语句的话,就是下面的现像,会一直让你输入数据
2.__dirname就是当前文件的所处的位置