阅读 290

Node.js学习日记(四):CLI和FS API:首个Node工具

需求:构建一个命令行文件浏览器,可以在当前目录下查找文件、显示文件和创建文件。

node.js的输入和输出

process对象中包含了三个流对象,分别对应了三个UNIX标准流: stdinstdoutstderr

stdin是一个可读流,其默认状态是暂停的。当这个流运行时,Node会观察对应的文件描述符,并保持事件循环的运行,等待事件的触发。如果不涉及IO等待,Node会自动退出。

stdout和stderr是可写流。console.log,它在指定的字符串后加上了\n换行符,并将其写到stdout流中。

 var stdin=require('process').stdin
, stdout=require('process').stdout;
复制代码
 stdin.resume()
 //stdin恢复
 stdin.setEncoding('utf8')
 //stdin设置输入流的编码方式
 stdin.on()
 //监听输入流
 stdin.pause()
 //暂停输入流
复制代码
stdout.write()
复制代码

Stream


const fs=require('fs');
const path=require('path');
let readStream=fs.createReadStream('./test/b.js',{encoding:'utf8'});
//console.log(readStream);
 
//读取文件发生错误事件
readStream.on('error', (err) => {
    console.log('发生异常:', err);
});
//已打开要读取的文件事件
readStream.on('open', (fd) => {
    console.log('文件已打开:', fd);
});
//文件已经就位,可用于读取事件
readStream.on('ready', () => {
    console.log('文件已准备好..');
});
 
//文件读取中事件·····
readStream.on('data', (chunk) => {
    console.log('读取文件数据:', chunk);
});
 
//文件读取完成事件
readStream.on('end', () => {
    console.log('读取已完成..');
});
 
//文件已关闭事件
readStream.on('close', () => {
    console.log('文件已关闭!');

复制代码

fs读写

fs.stat(path,callback)

读取文件的状态;可以判断它是不是文件,文件最后一次修改的时间等

callback: function(err,stats){}

返回值stats的具体方法有isDictionary

fs.readdir(path,callback)

path:

本地目录:process.cwd;

需要查找的目录:__dirname+'/'+filename

callback: function(err,files)

fs.readfile

需要查找的目录:__dirname+'/'+filename

callback: function(err,files)

fs.watchfile

var fs=require('fs')
var files=fs.readdirSync(process.cwd())
files.forEach((file)=>{
    if(/\.css/.test(file)){
        fs.watchFile(process.cwd()+'/'+file,function(data){
            console.log(' - '+file+'changed')
        })
    }
})
复制代码

整体实现

var fs=require('fs')
, stdin=require('process').stdin
, stdout=require('process').stdout;
const { exit } = require('process');
fs.readdir(process.cwd(),function(err,files){
    console.log('');
    if(!files.length){
        return console.log('\033[33m No files to show!\033[39m\n')
    }
    console.log('Select which file or directory you want to see :')
    var stats=[]
    function file(i){
        var 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[90m'+filename+'\033[39m')
            }
            if(++i===files.length){
                read()
            }else file(i)
        })
    }
    file(0)
    function read(){
        console.log(" ")
        stdout.write('   Enter your choice:  ')
        stdin.resume()
        stdin.setEncoding('utf8')
        stdin.on('data',option)
    }
    function option(data){
        var filename=files[Number(data)]
        if(stats[Number(data)].isDirectory()){
            fs.readdir(__dirname+'/'+filename,function(err,files){
                console.log(' ')
                console.log('  ('+files.length+') ')
                files.forEach(function(fileItem,index){
                    console.log('   -   '+fileItem)
                    console.log(" ")
                    stdin.pause()
                    exit()
                })
            })
        }
        if(!filename){
            stdout.write('   \033[31mEnter your choice:  \033[39m')
        }else{
            stdin.pause();
            fs.readFile(__dirname+'/'+filename,'utf8',function(err,data){
                console.log('\033[90m'+data+'\033[39m')
            })
        }
    }
})


复制代码
文章分类
前端
文章标签