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

devil      2022-02-17     312

关键词:

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(33[33mEnter your choice: 33[39m‘); //输出一行

stdout.write和console.log是不同的,console.log封装了前者并加上了换行符" "。

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 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(33[31m No files to show 33[39m
);

    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+‘]  33[36m‘+filename+‘/33[39m‘);
        else
            console.log(‘   [‘+i+‘]  33[90m‘+filename+33[39m‘);
        i++;
        //执行到最后一个文件
        if(i==files.length){
            read(filename);
        }else{
            file(i);
        }
    });
}

//读取文件函数
function read(filename){
    console.log(‘ ‘);
    process.stdout.write(33[33mEnter your choice: 33[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(33[33mEnter your choice: 33[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("33[90m"+data+"33[39m");
                });
            }
        }
    });
}

效果

技术分享图片

代码分析:

整个小程序代码十分简单,比起c语言实现一定是简单多的。需要注意的几点:

  1. process.argv是个数组,用于获取命令行执行后输入的参数,比如上面的目录地址。但数组参数要从第三个开始,前两个是:

技术分享图片

  1. file函数递归处理了readdir获取的文件和目录,可以使用files.forEach()遍历,效果相同。

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




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

使用Node做web开发废话:说起web开发,这真的算是我的老本行了,从进入计算机领域我习得的第一门语言便是php,到后来公司使用的ASP.NET平台,再到学校强推的JavaEE平台,后来自学了一点rubyonrails平台,一直到现在node.js做毕设终... 查看详情

将js进行到底:node学习8

Node.js与数据库之MongoDB废话:现代web开发可以说完全是数据库驱动的,而对于我这样的PHP程序员来说,对Mysql向来十分钟情,MongoDB的兴起让我不能再对Mysql孤注一掷,《了不起的node.js》一书中首推的数据库就是MongoDB,也许其性能... 查看详情

将js进行到底:node学习7

Node.js之Websocket技术我第一次听说websocket之时,HTML5标准尚未公布,当时只有少数前瞻性浏览器携带了这个API。我对websocket最大的印象是,他可以解决我对“在线聊天系统”开发的疑惑(我一直想不通http如何保持长连接),这样... 查看详情

将js进行到底:node学习6

开始真正的nodeweb开发——express框架为何说现在才是web开发的真正开始呢?首先任何企业都不会用原生的http协议API去开发一个完整的网站,除非她们先开发一个框架出来,其次我们之前的所谓http,connect都只是打开了一个http服务... 查看详情

node学习笔记

...me),发布于2009年5月,由RyanDahl开发,实质是对ChromeV8引擎进行了封装。Node.js对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好。学习视频:https://www.bilibili.com/video/av12300358/index_2.html#page=5why?1.性能2.j 查看详情

node.js学习笔记——回调函数

...或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。回调函数在完成任务后就会被调用,Node使用了大量的回调函数,Node所有API都支持回调函数。例如,我们可以一边读取文件,一 查看详情

「node学习笔记」浅谈node.js读写xlsx文件

...要查看流水账,作为开发人员可以将数据在node的服务层进行对应的整理,再通过写成Excel的方式给到客户使用。操作步骤step1:加载模块使用模块:fs–主要用于写入文件;node-xlsx主要用于转换xlsx数据和读取xlsx的文件数据; 查看详情

node.js学习笔记

1.Node.js本质上是一个JavaScript执行环境,跟Chrome的console命令行一样,可以直接在里面编写JS代码并执行两个的区别在于,都有一些自己独特的全局变量,譬如chrome中可以有window和document等,Node.js有process等全局变量   2.exports与mo... 查看详情

[学习笔记]node.js中的path.extname方法

path.extname返回path路径文件扩展名,如果path以‘.‘为结尾,将返回‘.‘,如果无扩展名又不以‘.‘结尾,将返回空值。path.extname(‘index.html‘);//returns‘.html‘path.extname(‘index.‘);//returns‘.‘path.extname(‘index‘);//returns‘‘&... 查看详情

node.js学习笔记一

node.js node是平台也是语言。它是平台或者运行环境,能够让js在服务器端运行,因为它封装V8引擎(引擎,能够将js代码解析成计算机能够懂得语言),能够让js运行在其他的平台上面,而不只是运行在浏览器上。它是服务器... 查看详情

系列文章--node.js学习笔记系列

Node.js学习笔记系列总索引Nodejs学习笔记(一)---简介及安装Node.js开发环境Nodejs学习笔记(二)---事件模块Nodejs学习笔记(三)---模块Nodejs学习笔记(四)---与MySQL交互(felixge/node-mysql)Nodejs学习笔记(五)---Express安装入门与模... 查看详情

文件系统(node.js学习笔记)

根据nodejs菜鸟教程整理。官方API文档:nodeJS文件系统API其他整理:nodejsFileSystem文件系统操作函数分类1、引用:导入文件系统模块(fs)语句:varfs=require("fs")2、异步与同步:异步:fs.readFile();  第一个参数为回调error信息。同... 查看详情

node.js之commander.js学习笔记(代码片段)

...。官网地址:Commander.js安装与引入安装执行如下命令进行安装,但前提是有node环境,即能使用npm命令进行安装:npminstall--savecommander引入如果是简单使用,Commander提供了一个全局对象://引入commander模块con 查看详情

nodejs学习笔记---简介及安装node.js开发环境

目录学习资料简介安装Node.jsnpm简介开发工具SublimeNode.js开发环境配置扩展:安装多版本管理器 学习资料  1.深入浅出Node.js http://www.infoq.com/cn/minibooks/nodejs  2.Node.js开发指南 简介(只捡了我觉得重要的)Node.js是让J... 查看详情

nodejs学习笔记---简介及安装node.js开发环境

目录学习资料简介安装Node.jsnpm简介开发工具SublimeNode.js开发环境配置扩展:安装多版本管理器 学习资料  1.深入浅出Node.js http://www.infoq.com/cn/minibooks/nodejs  2.Node.js开发指南 简介(只捡了我觉得重要的)Node.js是让J... 查看详情

node.js学习笔记-模块化开发(代码片段)

...aScript文件就是一个模块,模块内部的变量无法在外部进行访问。有两种方式可以实现访问。文件b中访问a中的变量和方法需要用exports将a中的变量和方法导出,并在b中用require方式引入//a.jsletversion=1.0 查看详情

node.js学习笔记--提交表单

说明(2017-5-211:42:33):1.index.html1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<title>Document</title>6</head>7<body>8<formaction="htt 查看详情

vue3学习笔记

一、搭建工作环境环境1、从node.js官网下载相应版本进行安装即可https://nodejs.org/zh-cn/download/,安装完成后在命令行输入node-v如果可以查询到版本号,说明安装成功。2、node自带npm包管理工具,在命令行输入npm-v如果查询到版本号... 查看详情