分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

将js进行到底:node学习笔记2

发布时间:2023-09-06 01:39责任编辑:沈小雨关键词:js

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编程实战——目录浏览

  1. 浏览指定目录下的文件与目录
  2. 用户可选择打开文件或目录查看
  3. 若是文件则打印文件内容,若是目录则进入目录查看目录内文件

代码:

var fs = require("fs"); ????//获取fs APIvar 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语言实现一定是简单多的。需要注意的几点:

  1. process.argv是个数组,用于获取命令行执行后输入的参数,比如上面的目录地址。但数组参数要从第三个开始,前两个是:
  1. file函数递归处理了readdir获取的文件和目录,可以使用files.forEach()遍历,效果相同。

  2. 代码中出现的”\033[33m“等用于格式化字体颜色,可以暂时忽略。

将js进行到底:node学习笔记2

原文地址:https://www.cnblogs.com/devilyouwei/p/8371074.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved