读<了不起的Node.js>-06.命令行工具(CLI)以及FS

2018-08-04  本文已影响0人  在路上的海贼

简介

需求

-定义需求

编写首个 node程序

创建模块

/这里版本号遵循semver 的版本控制标准/

{
  "name": "file-explorer",
  
  "version": "0.0.1",
  "description": "一个命令行文件资源管理器",
  "dependencies": {}
}

同步还是异步

/*
* 模块依赖
* */
const fs = require('fs');
//同步版本
 console.log(fs.readdirSync('.'));

[图片上传失败...(image-3124cc-1533372113516)]

/*
* 模块依赖
* */
const fs = require('fs');

fs.readdir(__dirname, (err, files) =>{
    console.log(files);
});

什么是流 stream

console.log('hello world');
console.log('-----------------');//换行
process.stdout.write('hello world');
process.stdout.write('------------');//不换行

输入和输出

/*
* 模块依赖
* */
const fs = require('fs');

fs.readdir(process.cwd(), function (err, files) {
    console.log('');

    if (!files.length) {
        return console.log('   \033[31m 没有文件显示 !\033[39m\n');
    }
    
    console.log('    选择您想要查看的文件或目录\n');

    function file(i) {
        let filename = files[i];

        fs.stat(__dirname + '/' + filename, function (err, stat) {
            if (stat.isDirectory()) {
                console.log('    ' + i + ' \033[36m' + filename + '/\033[39m');
            } else {
                console.log('    ' + i + ' \033[36m' + filename + '\033[39m');
            }
            i++;
            if (i == files.length) {
                console.log('');
                process.stdout.write('    \033[33m输入你的选择: \033[39m');
                process.stdin.resume();
                process.stdin.serEncoding('utf8');
            } else {
                file(i)
            }
        });
    }
    file(0);
});

重构

function read() {
        console.log('');
        stdout.write('    \033[33m输入你的选择: \033[39m');
        stdin.resume();
        stdin.setEncoding('utf8');
        stdin.on('data', option);
    }

    function option(data) {
        if (!files[Number(data)]) {
            stdout.write('    \031[33m输入你的选择: \033[39m')
        } else {
            stdin.pause();
        }
    }
    function option(data) {
        const filename = files[Number(data)];
        if (!filename) {
            stdout.write('    \033[33m输入你的选择: \033[39m')
        } else {
            stdin.pause();
            fs.readFile(__dirname + '/' + filename, 'utf8', function (err, data) {
                console.log('');
                console.log('\033[90m'+data.replace(/(.*)/g, '    $1')+'\033[39m');
            });
        }
    }

至此我们就完成了首个查看文件和文件夹内容的程序,虽然很简陋

/*
* 模块依赖
* */
const fs = require('fs'), stdin = process.stdin, stdout = process.stdout;


fs.readdir(process.cwd(), function (err, files) {
    console.log('');

    if (!files.length) {
        return console.log('   \033[31m 没有文件显示 !\033[39m\n');
    }

    console.log('    选择您想要查看的文件或目录\n');
    let stats = [];

    function file(i) {
        let filename = files[i];

        fs.stat(__dirname + '/' + filename, function (err, stat) {
            stats[i] = stat;
            if (stat.isDirectory()) {
                console.log('    ' + i + ' \033[36m' + filename + '/\033[39m');
            } else {
                console.log('    ' + i + ' \033[36m' + filename + '\033[39m');
            }

            if (++i === files.length) {
                read();
            } else {
                file(i)
            }
        });
    }

    function read() {
        console.log('');
        stdout.write('    \033[33m输入你的选择: \033[39m');
        stdin.resume();
        // stdin.setEncoding('utf8');
        stdin.on('data', option);
    }

    function option(data) {
        const filename = files[Number(data)];
        if (!filename) {
            stdout.write('    \033[33m输入你的选择: \033[39m')
        } else {
            stdin.pause();
            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);
});


    


    



上一篇 下一篇

猜你喜欢

热点阅读