将js进行到底:node学习2
2018-01-28 14:29
393 查看
node重要API之FS——CLI编程初体验
所谓的“fs”就是file system!当下几乎任何一门编程语言都会提供对文件系统读写的API,比如c语言的open()函数。
而文件系统读写API最广泛的用处就是CLI编程。
什么是CLI?就是client(客户端编程),早期的电脑没有图形界面,比如UNIX时代,一般客户端指的就是terminal(命令行终端)。俗称“命令行程序”。计算机系学生c语言第一课乃至第一学期都是在做命令行编程,所有的编程只能看到黑底白字的字符在电脑屏幕前输入输出。与CLI编程对应的就是GUI编程(图形界面编程)
进入正题“FS API”
IO输入输出
同c语言一样,把输入叫stdin,输出叫stdout,这两个都是IO操作,合称:stdio。stdio属于node全局对象process的一部分!
哪些环境下要用到stdio?当用户需要在终端输入以及查看输出时。
关于node中stdio的使用:
stdout:
process.stdout.write('\033[33mEnter your choice: \033[39m'); //输出一行
stdout.write和console.log是不同的,console.log封装了前者并加上了换行符”\n”。
stdin:
process.stdin.resume(); //重置输入,建议每一次重新输入前加上,清空之前输入数据 process.stdin.setEncoding('utf8'); //编码设置,UNIX类操作系统设置为UTF-8 process.stdin.on("data",function(d){ console.log(d); });
注:node的process对象有三个流:stdout,stderr这两个是可写流,stdin是可读流
fs模块——文件读写
引入文件模块并获取暴露的API:var fs = require("fs"); //fs获取暴露的API
同步读取
console.log(fs.readdirSync('.')); //读取当前目录内容
之前说过在node.js中最好搭配异步IO而不是这种同步IO,因为读取目录过程会阻塞之后的代码,我们看看异步读取这个目录。
异步读取
//定义一个事件回调函数 function async (err,files){ console.log(files) } fs.readdir(".",async);
效果同上,不过是异步加载了,所以需要一个回调函数。
你看readdir默认就是异步读取的,这是node的特色,如需强制使用同步读取就要用readDirSync!
写入
简单介绍创建文件并写入字符串方法
var fs = require("fs"); //在当前运行目录下创建文件并写入字符串 fs.writeFile('./message.txt','hello node.js',(err)=>{ if(err) throw err; console.log("file saved"); });
FS CLI编程实战——目录浏览
浏览指定目录下的文件与目录用户可选择打开文件或目录查看
若是文件则打印文件内容,若是目录则进入目录查看目录内文件
代码:
var fs = require("fs"); //获取fs API var files = null; //存储读取目录下的文件和目录 var stats = []; //存储文件状态(属性) var dir = process.argv[2]; //取得CLI输入的参数 fs.readdir(dir,function(err,f){ console.log(" "); files = f; if(!files.length || !files) return console.log('\033[31m No files to show \033[39m\n'); console.log("Select a file or dir"); file(0); }); //递归处理文件函数 function file(i){ var filename = files[i]; fs.stat(dir+'/'+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'); i++; //执行到最后一个文件 if(i==files.length){ read(filename); }else{ file(i); } }); } //读取文件函数 function read(filename){ console.log(' '); process.stdout.write('\033[33mEnter your choice: \033[39m'); process.stdin.resume(); process.stdin.setEncoding('utf8'); process.stdin.on("data",function(d){ var file = files[Number(d)]; var stat = stats[Number(d)]; if(!file) process.stdout.write('\033[33mEnter your choice: \033[39m'); else{ process.stdin.pause(); if(stat.isDirectory()){ console.log(dir+'/'+file+'/'); fs.readdir(dir+'/'+file+'/',function(e,f){ console.log(' '); console.log('files:'+f.length); f.forEach(function(fn){ console.log("---"+fn); }); }) }else{ fs.readFile(dir+'/'+file,"utf8",function(err,data){ console.log(" "+dir); console.log("\033[90m"+data+"\033[39m"); }); } } }); }
效果:
代码分析:
整个小程序代码十分简单,比起c语言实现一定是简单多的。需要注意的几点:
process.argv是个数组,用于获取命令行执行后输入的参数,比如上面的目录地址。但数组参数要从第三个开始,前两个是:
file函数递归处理了readdir获取的文件和目录,可以使用files.forEach()遍历,效果相同。
代码中出现的”\033[33m“等用于格式化字体颜色,可以暂时忽略。
相关文章推荐
- 将js进行到底:node学习3
- 将js进行到底:node学习5
- 将js进行到底:node学习7
- 将js进行到底:node学习4
- 将js进行到底:node学习8
- 将js进行到底:node学习6
- 将js进行到底:node学习1
- 将js进行到底:node学习10
- 将js进行到底:node学习9
- 了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发)
- 大熊君大话NodeJS之开篇------Why NodeJS(将Javascript进行到底)
- 了不起的Node.js: 将JavaScript进行到底
- [将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
- [将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
- 了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发)
- 快速使用node.js进行web开发详解
- 【《Node.js 实战》学习思维导图】第14章 Node生态系统
- Node.js请求接口前进行登录的判断
- Node.js学习