需求:构建一个命令行文件浏览器,可以在当前目录下查找文件、显示文件和创建文件。
node.js的输入和输出
process对象中包含了三个流对象,分别对应了三个UNIX标准流: stdin、stdout、stderr
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')
})
}
}
})