现在我们来简单的实现一个 Node 命令行(cli)文件管理程序。
效果演示
需求分析
- 程序在命令行中运行,那么程序需要通过node命令来执行,然后通过终端来实现用户的交互。
- 在程序启动后需要获取程序当前运行目录下的文件列表。
- 用颜色来区分文件与文件夹。
- 在选择某个文件时,则打开该文件。
- 在选择某个文件夹时,则打开该文件夹。
- 在输入错误的指令时,提醒用户输入错误,重新输入。
- 在输入 back 指令时,返回上一级。
- 在输入 end 指令时,退出程序。
项目解析
创建模块
- 我们先创建一个项目目录=> fileProject 。
- 新建 package.json 文件,用来对程序进行依赖管理,本程序还用到了colors 模块,可以安装如下定义。然后 npm install 安装依赖来测试该文件是否准确定义。
//package.json
{
"name": "fileproject",
"version": "0.0.1",
"description": "this file project",
"dependencies": {
"colors": "^1.1.2"
}
}
程序实现
- 新建一个 index.js 文件。
- 流:process 全局对象包含了三个流对象:
-stdin:标准输入
-stdout:标准输出
-stderr:标准错误 - fs模块:
-readFile:读取文件
-readdir:读取目录
-stat:读取文件与目录的信息
//index.js
//引入fs
var fs = require('fs');
//引入colors
require('colors');
//欢迎信息
console.log('欢迎使用管子文件管理系统 V0.0.1'.rainbow);
//文件系统
function selFile(baseUrl) {
//异步读取目录状态
fs.readdir(baseUrl, function(err, files) {
//错误判断
if (err) return;
//空文件夹判断
if (!files.length) console.log('当前文件夹没有文件!\n'.red);
//输出当前路径
var Urls = '\n当前路径' + baseUrl;
console.log(Urls.red);
//输出当前的文件夹及文件信息
function file(i) {
var fileName = files[i];
//获取文件信息
fs.stat(baseUrl + '\\' + fileName, function(err, stat) {
if (err) return;
var filest = ++i + '. ' + fileName + '\n';
//判断是否为文件夹
if (stat.isDirectory()) {
//文件夹
process.stdout.write(filest.yellow);
} else {
//文件
process.stdout.write(filest.blue);
}
// 判断是否获取完所有的文件信息
if (i == files.length) {
//执行下一步方法
read();
} else {
//继续获取
file(i);
}
});
}
//执行文件信息获取方法
file(0);
//用户输入
function read() {
process.stdout.write('\n请输入你要打开的文件或文件夹序号(输入back返回上一层,end退出程序):'.red);
//输入
process.stdin.resume();
//设置编码
process.stdin.setEncoding('UTF-8');
//获取用户输入
process.stdin.once('data', option);
}
//用户输入处理
function option(data) {
//停止用户输入
process.stdin.pause();
//判断是否是back返回输入
if (data.split('\r')[0] == 'back') {
//获取上一级地址地址并打开文件夹
selFile(baseUrl.split('\\').slice(0, baseUrl.split('\\').length - 1).join('\\'));
} else if (data.split('\r')[0] == 'end') {
//关闭当前程序
console.log('程序已退出...'.yellow);
process.exit();
} else {
//判断序号对应的文件是否存在
if (!files[Number(data) - 1]) {
process.stdout.write('您的输入有误!请重新输入!'.red);
read();
} else {
fs.stat(baseUrl + '\\' + files[Number(data) - 1], function(err, stat) {
if (err) return;
//检查选中的是否为文件夹
if (stat.isDirectory()) {
// 打开文件夹
selFile(baseUrl + '\\' + files[Number(data) - 1]);
} else {
// 输出文件内容
fs.readFile(baseUrl + '\\' + files[Number(data) - 1], 'UTF-8', function(err, conent) {
//文件路径
var filePath = baseUrl + '\\' + files[Number(data) - 1];
//输出文件名
console.log(filePath.split('\\')[filePath.split('\\').length - 1].yellow);
// 输出内容
console.log(conent.blue);
// 重新打开当前文件夹
selFile(baseUrl);
})
}
});
}
}
}
});
}
//打开默认程序启动地址
selFile(process.cwd());