将js进行到底:node学习笔记2
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学习笔记2的更多相关文章
- 《JS高程》事件学习笔记
事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. -------------------------------------------------------- ...
- node学习笔记(二)(ajax方式向node后台提交数据)
通过ajax向node后台提交数据过程(附手写前后台代码),并总结post与get的区别 POST 前台代码 //CSS简单给点样式 <style> form{ width: 200px; ...
- node 学习笔记 - Modules 模块加载系统 (1)
本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...
- node学习笔记第一天
ES6---* JavaScript语言随着使用的人越来越多,ECMA语法规范:if/else* 为了让js语言更适应大型应用的开发.旨在消除一些怪异的行为 ### 包含内容(strict严格模式)- ...
- node学习笔记1——require参数查找策略
require参数类型 http.fs.path等,原生模块 ./mod或../mod,相对路径的文件模块 /pathtomodule/mod,绝对路径的文件模块 mod,非原生模块的文件模块 mo ...
- Node学习笔记(二)
1.package.json详解Node.js 在调用某个包时,会首先检查包中 package.json 文件的 main 字段,将其作为包的接口模块,如果 package.json 或 main 字 ...
- node学习笔记6——自定义模块
自定义模块三大关键词: require——引入模块: exports——单个输出: module——批量输出. 从例子下手: 1.创建module.js: exports.a=22; exports. ...
- Node学习笔记之模块实现
一.模块分类 由Node提供的模块,称为核心模块:部分核心模块在Node源代码的编译过程中,编译进了二进制执行文件.在node进程启动时,该部分就直接加载进内存,文件定位和编译执行的步骤可以省略掉,并 ...
- 将js进行到底:node学习笔记1
废话:自高中以来一直对编程充满激情,磨剑五年,如今要毕业了,我不想用我已经擅长的知识敷衍,而想以一个全新的领域去面向我的毕设--是时候学习一下node.js node.js基础 对于JavaScrip ...
随机推荐
- js写基础insertAfter()方法
//DOM没有提供insertAfter()方法 function insertAfter(newElement, targetElement){ var parent = targetElement ...
- java多线程(二)-Runnable和Thread
Java在顺序性语言的基础上提供了多线程的支持.Java的线程机制是抢占式的.这表示调度机制会周期的中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片.(与抢占式多线程对应的是 协作式多线 ...
- Bash shell编程的语法知识点(1)
Bash shell脚本编程知识点如下(初学,不全,欢迎讨论补充): shell简介 脚本的简单介绍 变量和引用 算术运算 交互式编程 选择判断 条件测试 循环 函数 shell简介 shell是一种 ...
- Windows下phpStudy配置独立站点详细步骤
本文讲如何在phpStudy下配置 域名->站点 步骤. 开始之前,我们先添加几个本地域名(host文件),如果有域名映射到主机此步可以跳过,直接看后面的phpStudy配置部分. 首先打开ho ...
- ERP中自定义报表制作流程
查询制作流程 新增单表查询--查询语句设置--表格设置(列信息)--参数设置--关联设置--着色设置 报表设计需求(以差旅报销单为例) 1.制作按部门统计每个月的 报销金额并且可以关联到明细进行比对 ...
- [转载自阿里丁奇]各版本MySQL并行复制的实现及优缺点
MySQL并行复制已经是老生常谈,笔者从2010年开始就着手处理线上这个问题,刚开始两三年也乐此不疲分享,现在再提这个话题本来是难免"炒冷饭"嫌疑. 最近触发再谈这个话题,是 ...
- .NET HttpClient的缺陷
using (HttpClient client = new HttpClient()){} 每次发起http请求每次new httpClient,它会打开许多套接字,比你实际的需求多许多,这极大地增 ...
- IdentityServer(14)- 使用EntityFramework Core配置和操作数据
IdentityServer具有良好的扩展性,其中一个可扩展点是用于IdentityServer所需数据的存储机制. 本快速入门介绍了如何配置IdentityServer以使用EntityFramew ...
- MIPI协议-DSI
对于现代的智能手机来说,其内部要塞入太多各种不同接口的设备,给手机的设计 和元器件选择带来很大的难度.下图是一个智能手机的例子,我们可以看到其内部存储.显示.摄像.声音等内部接口都是各不相同的.即使以 ...
- WEB相关系列
一.Nginx(web服务器) Nginx概述和安装(1) Nginx配置文件(2) Nginx日常维护操作(3) Nginx常用配置实例(4) Nginx常用功能(5) Nginx性能优化技巧(6) ...