美文网首页
【管子先生的Node之旅·14】一个简单的Node应用

【管子先生的Node之旅·14】一个简单的Node应用

作者: 管子先生 | 来源:发表于2017-10-31 09:54 被阅读0次

现在我们来简单的实现一个 Node 命令行(cli)文件管理程序。

效果演示

file.gif

需求分析

  • 程序在命令行中运行,那么程序需要通过node命令来执行,然后通过终端来实现用户的交互。
  • 在程序启动后需要获取程序当前运行目录下的文件列表。
  • 用颜色来区分文件与文件夹。
  • 在选择某个文件时,则打开该文件。
  • 在选择某个文件夹时,则打开该文件夹。
  • 在输入错误的指令时,提醒用户输入错误,重新输入。
  • 在输入 back 指令时,返回上一级。
  • 在输入 end 指令时,退出程序。

项目解析

创建模块
  1. 我们先创建一个项目目录=> fileProject
  2. 新建 package.json 文件,用来对程序进行依赖管理,本程序还用到了colors 模块,可以安装如下定义。然后 npm install 安装依赖来测试该文件是否准确定义。
//package.json
{
    "name": "fileproject",
    "version": "0.0.1",
    "description": "this file project",
    "dependencies": {
        "colors": "^1.1.2"
    }
}
程序实现
  1. 新建一个 index.js 文件。
  2. 流:process 全局对象包含了三个流对象:
    -stdin:标准输入
    -stdout:标准输出
    -stderr:标准错误
  3. 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());

相关文章

网友评论

      本文标题:【管子先生的Node之旅·14】一个简单的Node应用

      本文链接:https://www.haomeiwen.com/subject/vndmpxtx.html