当前位置: 首页 > news >正文

自己做网站需要什么wordpress不用邮件确认

自己做网站需要什么,wordpress不用邮件确认,wordpress改主题,微商推广就算步子乱了又如何#xff0c;接着跳下去就好了。——《闻香识女人》 开始 011_Buffer_介绍与创建 hello#xff0c;大家好#xff0c;我们来学习一下buffer。首先来看看 buffer 是一个什么东东。buffer#xff0c;中文译为缓冲区#xff0c;是一个类似于数组的对象接着跳下去就好了。——《闻香识女人》 开始 011_Buffer_介绍与创建 hello大家好我们来学习一下buffer。首先来看看 buffer 是一个什么东东。buffer中文译为缓冲区是一个类似于数组的对象用于表示固定长度的字节序列。这个字节序列大家可能并不是特别懂所以我们换一句话来说这个buffer它就是一段固定长度的内存空间主要用于处理二进制的数据。 那么下边我们看一看特点。 首先的话 buffer 它大小固定并且大小不能调整这一点跟数组是不太一样的我们知道数组是可以新增可以删除元素的。其二 buffer 性能较好因为它可以直接操作计算机内存。第三个每个元素就是 buffer 当中的每个元素大小为一个字节。这里强哥列了个图这里边每一个 0 或者一表示是一个bit比特而 8 个 bit 所组成的空间把它称之为是一个字节。下边的话我们在代码层面来给大家演示一下 buffer 的相关操作。 关于buffer缓冲器- 笔记 首先我们先建一个文件我们先来看一看关于 buffer 的创建。 buffer 的创建主要有三种方式第一种方式是 alloc 方法第二个是 allocUnsafe第三个是通过 from 这三种方式来创建。我们首先来看看第一种创建方式声明一个变量buff然后 Buffer 点 alloc括弧里边儿我们传一个数字我给个10。这行代码儿的含义是创建一个十字节的buffer其中这个 buffer 是 nodeJS 的内置模块儿在启动时已经将这个模块儿自动的加载进来所以我们不需要手动导入就可以使用。 这里大家可以认为这个 Buffer 是一个全局变量然后 alloc 这个单词的含义是分配的意思 在这它是 Buffer 对象里边一个方法那么下边我们通过 log 来打印一下 buff 这个变量右键终端打开然后用 node 点杠 去执行一下这个 js 文件敲回车大家可以看到这是 buffer 的输出结果。 说明一点用 alloc 这种方法创建的Buffer每一个二进制位都会归零。 OK那么下边我们来看看第二种 buffer 的创建方式给个变量等于 buffer 点 allocUnsafe。在这里 Unsafe 单词的本意是不安全的意思我们还是一样来打印一下buf_2。 2 这里我们可以通过方向键上键来调出刚才那个命令的历史调出来之后直接敲回车就可以运行。 大家会发现这个输出结果跟刚才 a lock 那个输出结果是一模一样的。为什么这里要标识一个不安全这里要稍微解释一下。因为用 allocUnsafe 这个方法它所创建的buffer其中可能会包含旧的内存数据。同学可能会想为什么会包含旧的内存数据这里我稍微解释一下。内存空间它其实是可以复用的比如说 a 程序要执行它申请了一段内存空间等它执行完毕之后这段空间就没有人在用了所以当 b 程序在执行时就可以再次去使用这段内存空间。而用 a lock 这种方式在创建时它会对里边每一个二进制位都清零。但用 allocUnsafe 这种方式在创建 buffer 时它并不会对旧的数据做一个清空做一个归零。所以说用 Unsafe方法所创建的buffer它其中是会有旧数据的。 我来给大家演示一下比如说我在这里把这个数值加大 然后按上敲回车大家可以看一下这些就是之前程序遗留的内存数据 并且每一次查看它这个结果都不太一样。 所以说对于这样的buffer你在用的时候一定要格外小心稍有不注意就会导致程序出现一些问题。 那这里同学可能会有另外一个困惑说那既然这块不安全为什么不直接使用 alloc再来说明一下子就说用这种方式去创建buffer它的速度要比 alloc 要快一些因为它毕竟不需要做归零这样一个操作只需要在用的时候稍微注意一下就可以了。 好那么下边我们再来说一下第三种创建方式。这里我们可以通过 Buffer.from可以将一个字符串或一个数组转为buffer。这个 from 单词的本意是来自于的意思比方说我这里写一个hello好咱们接下来打印一下子这个 buff下划线三然后按上敲回车。然这里多输出了一个我们把这个 2 先注释掉然后按上敲回车。 大家可以看一下这个结果 68 65 6C我们再来执行一次这个结果还是 68 65 6C那么这个 68 65 6C 它是怎么来的要稍微解释一下。那么在转换时这个每一个字母都会转换为这个字符在 Unicode 码表当中对应的那个数字然后这个数字会转成二进制然后存到 buffer 当中 我们来验证一下子打开浏览器以 h 来为例就是第一个字符这个 h 在 asking 码表当中这个数对应的数字是104。 同学可能会说强哥刚才不是说 Unicode 码表吗怎么又来开始整这个 ASCII 码表稍微解释一下因为这个 Unicode 码表是完全兼容 ASCII 码表的所以它对应的数字其实是一样的 h 对应的是104。 好回到vscode过来咱们再看一下同学说不对是吧这不是 68 嘛怎么能是104 再稍微解释一下这个 68 它其实是一个 16 进制的表示方式 我们切过来清空一下子我把 68 放进来看一下十六进制68它所对应的十进制就是104所以这块儿是没有问题的。 对应的后面的 ello 也都是一样它们会转成数字然后存到 buffer 当中。 那么其次这个 from 它还可以把数组也转成buffer。举个例子比如说4然后等于一个 Buffer.from 数组我提前准备好了大家来看一下。 看这个把咱们复制一份然后拿过来放在这然后我们输出一下 buf_4 在转换的过程当中数组里面的每个数字都会转成二进制然后存到 buffer 当中我们来验证一下效果按上然后敲回车。 大家可以看一下这个 buffer 就已经是出来了这里再来做一个补充就是 buffer 这块内容对于大家第一次接触人来说还是有一定的困难的不过大家不必太过于担心把代码敲一敲练一练对他有一个认识就可以了。 012_Buffer_操作与注意点 我们来学习一下 buffer 的操作与注意事项。首先的话我们先来看看第一个操作就是 buffer 与字符串的转换这里我们又建了一个文件首先我们来看看 buffer 与字符串的转换首先我们先把上一个小节所创建那个 buffer 拿过来就是这个 buffer_4拿过来之后 我们可以把这个 buffer 转换成字符串。怎么来转换可以借助于 buffer_4 这个 对象里边的一个方法叫做toString。好那么接下来我们来看效果右键终端打开 然后 node 2- tabletab键补全 敲回车大家可以看一下叫做 i love you这个就是 buffer 转成字符串之后的结果也可以算作是一种花式表白的方式。 当然这里要顺便说一下在转换字符串时它是默认采用的 UT F-8 的编码方式做的这个字符串转换当然还有一些别的编码方式的转换因为用的不多所以我们这里就不再一一介绍了。 好下面的话我们来看一下第二个操作就是关于 buffer 元素的读写。我们说过的这个buffer它是类似于数组的一个元素所以我们可以通过中括号下边的方式来对 buffer 里边的元素进行操作。举一个例子比方说我们这个 buffer 先创建一下子以这个 hello 来为例我们获得一个buffer现在我想获取一下第一个也就是这个h第一个元素它里边所保存的数据该怎么来获取呢我们可以这样来做就是通过 buff 下标 0 来获取。好我们来看看效果。 摁上敲回车大家可以看一下这个值是104这是一个十进制的表示方式 如果说你想看看它底层二进制的表示形式我们可以在这个数字的后边加一个 toString来一个2。 注意这个下面的 toString 跟这个上面的 toString 可不是一个意思咱这个下面的 toString 是进行数字的进制转换的。好摁上敲回车可以来看一看它这个值是1101000。 同学说不应该是8位吗怎么是 7 位其实在这个第一位的前边它还有一个0所以最后它真正所保存的值应该是01101000这是对于 buffer 里边单个元素的一个查看。 那比如说我还想对里边的单个元素做一个修改可不可以呢这个也是可以的比方说我们写一个 buff 来一个0然后等于一个95举个例子。 好那么 95 改完之后我们来看看打印一下 buff 改完之后这个值到底有没有变化按上它回车看一下这个值是5F之前是多少咱们可以来看看在改之前那个值可以做一个输出然后按上敲回车之前是68现在变成了5F所以这个值它是可以更改的。 并且我们还可以看看这个 buffer 在改完之后转成字符串它长什么样子按上它会吃它变成了一个下划线然后 ello 了。 好这是当前的话关于 buffer 的第二个操作就是通过中括号的方式对其中元素做一个读取和写入。 下边我们来对这个 buffer 做一个补充说明主要是有两点第一个是关于溢出第二个是关于中文。那怎么一个溢出法我们来举个例子就以刚才这个 hello 来为例把代码打开我们这里写一个buff下标来一个 0 等于 1 个361。同学可能会想说这 361 有什么问题吗当然有问题啥问题就是 8 个二进制位它所能存储的最大数字是255这里我们可以打开计算器给大家来看一下选择二进制输入八个1。 大家注意观察十进制最大数字是255你这里给一个 361 用八个二进制位肯定是装不下的那么在这种情况下你再尝试去修改单个字节的值那么这一步它会做一个事情就是舍弃高位的数字。怎么一个舍弃法呢就是把高于8位的那些数据全部都丢掉我们来演示一下给大家给大家演示一下它的一个过程。 361咱们先来看一看361它转成二进制位是这样的一个值 这是四位这是四位这是一位 其实总共是九个二进制来表示361。然后在保存时 node 会把高于8位这些数据全部都舍弃掉所以真正在写入时它其实长这个样子拿过来。 然后咱们再来看看这个内容转成十进制是多少然后在这里选择二进制 control v 它是105十六进制是69注意十六进制是69我们来看看改完之后它有没有变化。 console log 打印一下 buff 来运行一下摁上怎么回事可以看一下此时它变成了69确确实实是把高于8位内容给舍弃的。 当然这里我要再补充一点这块内容大家了解即可咱们后边儿是用不到的。 那么其次还有一个注意事项是关于中文的我把这代码再 copy 一份儿然后我们这里不写英文字符了来一个。你好两个汉字。我们来看看这个时候 buff 它的一个结果按上敲回车大家可以看一下这个时候的结果它其实是 6 个字节并不是两个字节。 为什么不是两个字节因为这两个中文它是 UTF-8 的中文大家注意观察这个位置是 UTF-8 的中文 而一个 UTF-8 的中文字符它一般是占三个字节的在这里你占3个。‘好’占3个那么这小节关于 buffer 的操作与注意事项我们就先说这么多。 013_计算机基础_计算机基本组成 这个环节我们来介绍一下计算机的基本组成首先的话我们来先看看三大零部件第一个是CPU又被称之为是中央处理器是整个计算机运算和控制的中心就是我们的程序哪怕是最简单的 1 1 这样的运算最后也都是由 CPU 来完成的。 那么其二是内存是存储数据的一个介质可以在里边存放大量的 0 和1这样的数据。那其二是硬盘它跟内存很像也可以存储很多的01这样的数据。 那同学可能会有一个问题那既然内存和硬盘都可以存储数据那为什么要做两个设备这里我们首先给大家做一个补充说明内存它存储数据有一个特点读写速度特别快但是在断电之后它会丢失数据那我们的程序在运行时都会载到内存当中然后像 CPU 高速的对这个数据做一个执行和处理那同学可能会说那这个东西断电之后就丢了这个你别着急这个时候硬盘的作用就体现出来了硬盘它读写速度相对较慢但是它断电之后不丢失数据。像咱们平时下载一些程序英雄联盟、浏览器、 QQ 这些程序下载安装完之后都是装到了硬盘里边而且装完之后断电之后它是不消失的。 下边的话我们再认识另外一个元器件这个元器件的名字叫做主板主板是一块大的集成电路板然后上面有很多插槽 我们刚才所说这些个器件就是插在插槽里面通过主板连在一起的 然后还有另外一个器件我们平常也会听到就是显卡是负责处理视频信号的当有信息需要呈现时需要在显示器当中呈现时就会将信号传递给显卡。显卡处理完毕之后再把信号传递给显示器然后显示器最终显示然后显卡是插在这个位置的当然了这个位置也可以插好了。 把这块组装完毕之后我们再把这些元器件放到一个机箱当中这个电脑就组装差不多了可以看一下这是组装之后的一个效果 然后眼前这个放光的它其实是散热器 在散热器的下边是CPU为什么装散热器嗯简单说一下是因为这个 CPU 它工作时会产生大量的热量热量的话需要散走传递出去否则的话会影响它运算的一个效率而这个就是散热用的那这个散热器的话有的是水冷的有的是风冷的都行目的都一样反正就是为了把热量散出去。 然后这个是内存条这四个发光的他们是内存条。 然后眼前这个 RTX 这个东西是显卡然后显卡的话它后边大家可以看一下有好几个这个输出的视频口到时候会接上显示器然后把信号传递给显示器去呈现画面。 好然后这个硬盘它这个模型里边并没有体现出来它的硬盘其实放在这后边就是这个红线他们接到了后边那个区域。 好等把这个机箱组装完毕之后我们再给机箱组装一些外设整个电脑就算是组装完毕了。比如说有显示器然后有这个键盘、鼠标然后音响这些都算是计算机的外设好了然后关于整个这边的一个组成我们就先说这么多大家对这个结构有一个认识就 OK 了。 014_计算机基础_程序运行的基本流程 hello大家好那这个节我们来介绍一下程序运行的基本流程注意这个我们只讨论基本流程过分的细节我们在这里不做讲解。那么在上一个小节我们介绍了一下计算机的组成然后并且还说了一下把它放到机箱里边就可以去运行了。 那么其实当我们把所有的硬件全部都组装完毕然后通上电之后这个计算机它其实也不能够正常的去运转去运行因为它还缺一个非常重要的角色叫做操作系统我们常见的操作系统有这么三个第一个是Windows第二个是Linux第三个是macOS。 那么操作系统是个什么东东那么其实它们的本质也是一种应用程序就是说它们也是01010101那么这种程序它负责来调度和管理硬件资源。什么意思我起来举个例子比如说操作系统它可以决定让 CPU 去执行哪一个程序再比如说这个 CPU 它可以对内存的资源进行管理它可以创建然后它可以销毁。那么其次操作系统也可以跟磁盘进行交互比如说创建文件、删除文件等等操作这些事情都是可以由操系统来完成的。 那么这里我们以 Windows 来为例咱们平时会说装系统那么装系统这个过程其实就是将操作系统这个程序安装到硬盘的这样一个过程那等我们把这个操作系统程序装到硬盘之后这个电脑就可以开机去运行了。 那么整个运行流程大体是这样的一个过程首先它会先将 Windows 相关的一些程序文件先载入到内存里边载入内存之后 CPU 就可以去运行了。那么在执行的时候如果发现了有视频信号就是需要在显示器里边去呈现那就会交给显卡去处理然后显卡处理完之后再交由显示器最后去呈现。那在处理过程当中如果说遇到了声音信号就要播放了这个时候会这个时候会交给声卡然后声卡再把信号传递给外部的播放设备比如说耳机再比如说这个音响之类的它们一结合就会成这样一个效果。好这是我们简单说了一下操作系统它的一个启动的过程也算是计算机它启动的一个基本过程。 那么在说完了操作系统之后我们再来说一下应用程序。这里的话我们以英雄联盟来为例啊其实不光是英雄联盟那像咱们平时这个什么浏览器、 QQ 播放器这个流程基本上是一模一样子的。 那么我们要想玩这个英雄联盟首先咱们得先下载那么下载的话一般咱们从官网然后下载这么一个文件下载完之后然后我们就可以去安装那么安装英雄联盟到哪其实就是把它安到硬盘里边我来给你演示一下把这个英雄联盟装到哪了这里我来放桌面了你看怎么来看点击这个图标然后右键我们点属性点完属性之后大家可以看这有一个打开文件所在的文件夹 咱们点一下诶点完之后你可以看一下这个就是现在英雄联盟所装的一个位置我是把它装到了 d 盘的 WeGameApps 这个文件夹里边。 那么装到硬盘之后我们就要启动怎么启动就是双击那个图标就可以启动然后双击图标之后它做哪些事情我们来给大家说一下。 那大体流程跟那个操作系统的启动是一样子的首先要先把这个英雄联盟的相关程序要先载入内存载完内存之后然后 CPU 去内存里边读取指令然后执行指令执行的过程当中如果说遇到了视频信号需要处理交给显卡让显示卡把信号传递给显示器去显示。那处理的过程如果遇到的音频需要处理会交给声卡然后声卡处理完之后再交给这个 Web 的播放设备比如说公放比如说耳机最后就有这样一个效果。 好那么这是我们讲了一下程序运行的基本流程。 我们做一个小结那这个程序它一般都是保存在硬盘当中的注意这里用一个“一般”为什么呢因为还有一些是存在这些软盘其他一些介质里边的。然后这个软件的安装过程比如说安装什么QQ安装什么这个 Chrome 浏览器这个安装过程其实就是将程序写入硬盘的一个过程然后这个程序在运行时它会首先加载其内存。 程序在硬盘里边是不能执行的 CPU 也不能到硬盘里边直接取运行程序它必须要载入内存因为内存的操作速度是比较快的当载入内存之后然后 CPU 再从内存当中读取指令然后执行程序。这是我们给大家讲了一下程序运行的一个基本流程这时为后边的这个知识打一个基础。 015_计算机基础_进程与线程 我们来认识两个概念第一个是进程第二个是线程。 我们首先什么是进程我们首先可以通过字面儿意思去理解这个进程可以理解为进行中的程序比方说这里有一段儿程序这一段儿程序的话已经载入内存了然后我们的 CPU 开始执行它那这个时候就会产生一个进程。 当然了我们还可以用另外一种方式去理解这个进程这个进程是程序的一次执行过程是一个相对来说比较抽象的概念。如果在 Windows 里边或者说在 Linux 里边它都给我们提供了一些方式来查看整个计算机里边的进程。这里我们以windows起来通过任务管理器来查看计算机里边所有的进程然后我们这里在下边的任务栏然后右键可以看到这里有一个任务管理器 然后点开它之后你就会发现这里列出来很的东西那这个东西其实就是进程。 当然有同学说我打开怎么是这样子的别急 可以点击详细信息就可以列出来整个计算机所有的进程。 那比方说这里还可以去启动一个新的进程我这里双击QQ大家可以看一下当我双击完 QQ 之后它启动了QQ这里就多了一个进程那比方说我再来启动一个大家可以看一下它会再次去启动一个新的 然后把这个关掉京城少一个。然后我再关一个京城又少一个哎当然了进程这个关闭稍微有点延迟。 好那么回过头来我们再接着继续来看另外一个概念。什么是线程 这个线程是一个进程中执行的一个执行流这个线程是一个进程中执行的一个执行流。可以看出来一个线程它是属于某一个进程的。 比方说大家看这里我这里列了两个进程在进程里面会包含它所有的线程。那这里要说明一点就是一个进程当中它至少要包含一个线程可以有一个是吧也可以有多个。 这个我们通过程序也是可以查看的。通过这个 pslist 这个命令我来给大家演示一下子。 比方说这里我们找一个程序比如说以火绒来为例它的这个进程是进程ID它的进程 ID 是9452 打开 cmd然后在这里输入命令输入命令叫做 pslist然后 -dmx 后边跟上这个进程ID也就是9452然后敲回车。 大家可以看到这里列出来好些内容而这些内容就是是当前进程所启动的线程。好当然了这里我要给大家我需要给大家说一个说明就是这个命令 pslist你在你的电脑里边直接去运行它是不好使的不过这个相关的程序已经把它放到资料文件夹里边了有兴趣的同学大家可以自个尝试去运行一下子。 这个并不是我们所学习的一个重点大家只需要知道进程里面是包含线程就可以了。 好那么下边的话我们再来给大家举一个例子然后就是方便大家更好的去理解这个进程和线程。比方说开了一个蜜雪冰城的饮品店这呢买应聘那我这个店呢只要一营业一上班那么整个店的运作它其实就是一个进程。 然而在这个进程当中就大家可以看到有很多员工这个员工大家可以看一下这个员工在洗水果然后这个员工的话他正在接待用户而这个员工他正在制作他们三个人在做三个不同的事情他们所做的事情是不同的线程而线程在一起他们组合形成了整个的进程然后为用户去提供服务。这就是进程和电程的一个关系。那我们讲这个内容的话也主要是为后边内容做一个铺垫大家知道了线程和进程之后在后边的学习当中也会变得稍微的轻松一些。 016_fs模块_写入文件 我们来学习一下nodeJS 的 fs 模块也可以把它称之为是 fs API。那什么是fs它是两个单词的首字母的一个拼写叫做 file system意为文件系统。 那这个 FS 模块它有什么用它主要是可以跟我们的硬盘进行交互比如比如说可以实现文件的创建、删除、重命名、移动等操作还有可以完成文件内容的写入和读取以及文件夹的相关操作。 不得不说这个 fs 是 nodejs 当中非常重要的一个模块当我们在掌握了这个模块之后在将来理解某一些程序时就会变得非常非常的简单。那这个条件的话我们来介绍一下如何使用 fs 来写入文件内容。 好下面的话我们来实现一个效果。首先咱们先新建一个文件叫做文件写入.js。 说一下我们的需求打算去新建一个文件文件名叫做座右铭.txt并且往这个文件当中写入一段内容。写入什么内容三人行则必有我师焉这是一个需求。 好如何使用 FS 模块来实现这个效果首先第一步我们要先导入 FS 模块。 如何来导入我们可以使用 const fs reqire(fs); 通过这样一个语法来将其导入。首先前边这个是一个声明符号你可以使用const也可以使用var也可以使用let这个都可以。 而这个 fs它是一个变量的名称这个名称你可以自定义只要满足标识符的要求就可以了。不过绝大多数情况我们都会把它命名为 fs。而这个require它是一个全局的函数可以用来导入模块儿。这个名字你不能随便儿写必须要写成require。而里边儿这个fs它是模块儿的名称你也不能随便儿写必须要写成fs。 好那么导入完毕之后下边第二步就是写入文件怎么来做很简单 fs.whiteFile括弧 white单词的本意是写入的意思而 file 单词的本意是文件的意思。那么这个方法它接收这么几个参数总共是 4 个参数大家看一下 第一个是文件名就是你要往哪个文件里面去写内容第二个是 data 数据就是你要往文件里边x写入什么内容。第三个是一个选项配置对象它是一个可选参数。第四是一个callback是一个回调函数。 好那么回过头来我们开始来写参数。第一个参数往哪儿写我们打算往当前文件夹的这个座右铭.txt往这个文件里面去写这里有一个小点就是文件如果不存在它会帮我们自动创建文件并写入。好那么这是第一个参数。第二个参数要写入的内容三人行则必有我师焉这段话复制一份儿拿过来。 第三个参数是一个可选的一个配置对象这里我们用不到所以先不写第三个函数直接写最后一个回调函数这个回调函数它什么时候执行是当写入在完成之后就会自动去调用这个回调函数并且会把错误传递给咱这个函数你也可以认为是传递给这个error。 这里还有一个小点需要说明一下就是如果说写入失败了那么 error 它的值就是一个错误对象如果失败了写入如果失败它的值就是一个错误对象。那如果说写入成功如果写入成功的话 error 值就是一个null。当然这个形参名字你可以随便写 不一定非要写 error 写 abc 也是可以的 所以在这里我们可以判断这个 err 它的值来去得知我们的写入到底成功还是失败可以像这样子哎如果说 error 我们可以输出一下子来一个写入失败那如果说他要是失败的话他不是 null 他就会走里边。那如果说他要是 null 的话他就不会走这他就会走下边给你做一个输出 console.log 来一个写入成功。 好了然后咱们来看一看效果怎么样右键终端打开然后 node 1杠table自动补全 敲回车。好可以看一下此时座右铭.txt这个文件就被创建出来了并且内容已经OK。 那么其实到这儿之后同学可能会困惑说强哥你这是咋了我们明明可以直接右键新建文件然后往里边手动填内容保存文件就可以搞定的为什么还要去写一个脚本让这个脚本来费这么大劲去实现这个效果这里我要解释一下这是很多新人刚学习 nodejs 的一个困惑就总感觉我右键就可以新建然后并且也可以手动去完成这个事情。 下边的话我来举个例子给大家说明这个问题。比方说咱们做一个网站用户来访问咱这个网站 有一个需求就是我希望记录用户每一次请求的时间并且把它记录在一个文件当中。 那么你想一想这个时候你如果安排一个单独的人在这来一个人然后你记一下来一个人你记一下这个其实是非常非常不现实因为人可能会比较多有些时候的话可能成百上千甚至上万的人然后一下子涌到我们这个网站。 你这里安排一个人他可能忙都忙活不过来但是我要拿脚本下次就可以把这问题搞定。哎你来个人我写一次来一个人我写一次可以很方便的实现自动化所以这就是我们用代码去实现和手动实现它们的一个差异。 那么其次我还想再问一个问题大家思考一下就是我们平时打开编辑器打开一个文件然后编辑文件编辑文件完了之后我们会保存文件那保存完文件之后他又做了哪些事情那么其实保存完文件之后这个编辑器也是把这个信息写到了文件当中。 再说一个有意思的事情这个 vscode 我们当时讲过它也是借助于 nodejs 能力开发出来的大家虽然说它是借助一个框架election而这个 electron 它是借助于node 搭建起来的那么 vscode 在写入文件时也是借助了 node 的 fs 模块实现的文件写入 也就是说我们这里诶保存了一下子它底层也用到了 fs 这个模块是不是感觉很神奇 017_fs模块_同步与异步 我们来介绍一下 FS 模块儿工作的两种模式一个是异步一个是同步。 这两个概念连接起来稍微有一些难度所以我们首先来举一个例子比如说我跟李靖两个人打算去篮球场打会儿篮球然后我们两个人商量好然后出发了出发走到一半李靖突然跟我说她肚子怎么不得劲儿难受的不行需要去方便一下然后转头就跑向这个卫生间了。 那么这个时候的话我就面临一个问题就是我等它还是不等它我们首先的话先来看第一种情况就是同步的情况同步情况就是我会等他从卫生间回来然后我们两个人在一起去篮球场这是一个同步的情况。还有另外一种情况就是异步的情况是我不等他走他的然后我走我的那么哪种情况效率会更高 其实异步的效率会更高我不会在原地等待然后直接进到篮球场就可以去打篮球了。但是我们在上学的时候往往会走同步的模式就是会等小伙伴完事之后我们再一起去回教室或者是去操场。 下边儿的话我们在代码儿层面来给大家演示一下儿 fs 模块儿的两种模式。 其实我们上一个小节所写的这个 whiteFile它就是一种异步的工作模式 我们的代码自上而下开始运行走到 whiteFile 这一块儿它要进行磁盘的写入而此时它会将这个磁盘写入操作交给另另外一个线程去完成。也就是说现在我们有两个线程第一个线程是 js 的主线程来执行解析 js 代码。 第二个是我们的磁盘的写入这样一个线程我们把这一列线程统称为是 io 线程输入和输出线程 然后我们在启动这个线程之后 whiteFile 这个方法有一个特点就是它是异步的异步是不会等待这个结果回来的它会直接向后去运行后边代码。 而这个 io 线程在写入完毕之后它会将这个回调函数大家可以看一下这个回调函数然后压入到任务队列当中。 这一块内容跟当时讲的定时器是非常非常像的就它会把这个回调函数执行这个任务压到队列当中等 js 主线程它再把这些初始化的代码执行完毕之后然后就会从任务队列当中把这个回调函数取出来然后再执行。 我们来举一个例子比方说在下边做一个输出简单一点儿 1 1按照我们之前常规的认识代码儿都是自上而下按照顺序执行的然后如果写入成功它会先输出写入成功然后再去输出这个 1 1 2。但是异步它的工作模式却不是这样子的我们打开终端来看一看它的一个执行结果node然后 1/ table 大家可以看一下它是先执行了第 19 行这个代码然后再去执行这个回调函数。 其实就是刚才我们所说那样一个流程当我们代码执行到这一块之后它交给另外一个线程去进行磁盘写入 主线程是不会等待结果主线程直接去执行后续代码所以先走了 19 行的一个输出然后等 io 线程在完事之后它把回调函数加入到队列当中然后等 js 主线程再把这些初始化代码全都执行完毕之后它再去任务队列里边把这个回调函数取出来再执行。所以它这个输出结果先是 19 行的2然后是 16 行的写入。 好那么下边我们再来介绍一下 fs 模块写入文件的另外一种模式就是同步写入。同步写入它是用的另外一个方法叫做 whiteFileSync 这个Sync它是同步那个单词的简写 synchronize 而这个方法的参数跟 whiteFile 大致是一样的只是没有最后回调函数这个参数。 好我们来写一下比方说咱写一个 data.txt写什么内容写一个 test 就是测试的意思好完事儿别的参数咱没有下边去运行这个文件 ndoe 1 杠Tab然后敲回车 然后大家可以看一下此时多了一个文件叫 data.txt而我们写的文本也已经在里面了。而这个 whiteFileSync它的工作模式跟上面这个 whiteFile 是不太一样的。代码自上而下开始运行走到这儿之后 OK io 线程开始去进行磁盘写入这个时候主线程就停了就不再往后执行了而是等这个写完的一个结果等它写完之后我们的主线程再往后继续执行。 然后这两种模式哪个效率会更高很显然这个异步的操作效率会更高一些所以在针对一些对效率要求比较高的情景都会选择用异步的这个方法但是也不是说同步的 API 就用不到比如说我们做一些自个的一些小工具那还有就是对性能要求不是那么高的场景都是可以用这个同步的这个 API 的。 而且同步 API 它还有另外一个好处是什么呢就是它更容易理解因为它整个的执行都是按照顺序一行一行去执行的而不会出现让异步那样子回到函数先执行这个再执行那个这个场景。所以同步的 API 在用起来的话更容易让大家接受可能这会儿你感知不出来别着急等后边再写一写案例时就能体会出来其实同步 API 也是挺方便的。 好了那这个节关于 FS 模块点入文件的两种模式就先说这么多。 018_fs模块_文件追加写入 hello大家好我们来学习一下使用 fs 模块儿实现文件的追加写入。 这里我们会用到一个方法叫做 appendFileappendFileSync。下边的话来给大家演示一下这个效果。比方说我们在上一个小节往这个座右铭.txt 里边写了一段话叫三人行则必有我师焉。 我们打算借助于第二个脚本往这个文件的尾部再追加一段话叫择其善者而从之其不善者而改之。 好那么怎么来实现这个效果首先第一步我们还是要去引入这个 fs 模块 const  fs 等于 required(fs)那么第二步我们需要去调用方法调用谁调用 appendFile 这个方法。fs然后 appendFile 括弧这个 appendFile 的参数跟 whiteFile 的参数是一样的。 第一个参数是文件路径座右铭.txt。第二个是要追加的内容我们把这个文本加进来“则其善者而从之则其不善者而改之”这是第二个参数。第三个参数是一个配置对象我们用不到直接去写第四个参数就是这个回调函数这个回调函数有一个形参叫error当然它名字可以随便写它在追加完成之后会去执行并且会接收到一个参数那如果写入成功他所接收到的值就是null。如果追加写入失败他就会接收到一个错误对象。 所以这里我们可以做一个判断如果说 error 它要是一个错误对象它不是null因为错误对象的话强制转化为布尔类型的值是一个ture我们就可以做一个输出console.log 一个写入失败然后 return 一下停止代码运行。那如果说 error 要是一个 null 的话你想他肯定不走这他会走下边就如果为 null 他写入成功我们做一个成功提示来一个“追加写入成功”好了那么代码我们就已经写完了写完之后我们来试一试看看效果怎么样。 打开终端然后 node 2-  tableTab自动补全 敲回车。好大家可以看一下效果在这个 txt 的文件的后边就多了一段话就是在这个则必有我师焉的后边就多了一段 大家同学说少一个逗号哎少逗号这个好办是吧我们可以把这段文本先手动把它删掉删完之后咱们在要写的内容前边加一个逗号保存这回来看看效果。摁上敲回车大家可以看到这里就多了一个逗号没有问题。 好了这是一种写入方式当然了我们还可以呢使用同步的那个 API 方法。fs.appendFileSync 括弧然后第一个参数还是路径座右铭.txt。第二个是我们要写入内容是温故而知新可以为师矣。 好大家注意观察这是目前代码这是我们这个同步写入的一个代码我们来执行一下试一试来一个 node 2- TAB 敲回车。 大家可以看一下。在这儿的话就多了一段话了 大家同学可能会说这也没有换行能不能换行去写入这也是可以的我们只要在写入的内容前面去加一个 br 标签就行看大家很多同学可能会这样想。 br 我只是开个玩笑。 br 是不行的在 fs 这个模块当中如果你要想换行的话需要使用的是杠 r 杠 n 哎 用这个符号来去实现换行不能使用 b r 标签儿。好我们这回再来试一试然后摁上敲回车。 好大家可以看一下这次它就会在新的一行来帮我们去追加一段文本好了那么这是我们给大家演示一下文件的一个追加写入。 那么其实我再说一下我们用这个 whiteFile 也是可以实现追加写入的。当然这个大家了解一下比方说我们这里来一个 fs writeFile 括弧还是往这个座右铭.txt 去写一段话比方说叫love love love。 好注意看一下我们只写这个当然后边的回调函数我们得加上来一个error如果说 error 要是有值是一个错误对象则表明是写入失败了然后我们把代码停掉否则的话我们提示一个写入成功。 那如果我们单纯这么去写的话其实是达不到我们的目标的大家可以看一下按上再回车那么你会发现他会把我们的原来内容给清空然后他去填写新内容 我们希望追加怎么办先 control z 退回来 然后这个whitefile它的第三个参数是一个配置对象在这个配置对象里边有一个标识的属性叫flag然后我们把这个 flag 的值设置为 a也是可以实现 appendFile 一样的效果的就是追加写的意思。 好大家看一看摁上敲回车你看这三个 love 就在为师 后边然后添加上了。 顺便我再说一下我们什么时候会用到这个追加写入就是需要持续的往文件里边儿写入内容比方说日志程序的日志我们可以用这个方法来实现就是不停地往一个文件当中去写内容。再比如说那一次我们讲一个案例就是咱们搭一个网站用户来我们的网站访问希望记录用户的访问时间和相关信息。在这个时刻我们也可以使用 appendFile 在文件尾部不停地追加内容。好关于文件的一个追加写入我们就先说这么多。 019_fs模块_文件流式写入 hello大家好我们来介绍一下使用 fs 模块对文件进行流式写入这里我们主要可以用到一个方法就是 createWriteStream 这个方法来实现效果。 那么下边我们来说一个需求于是我们打算写一首诗这个诗的名字叫做观书有感然后我们把这个诗的内容写到观书有感.txt 这个文件当中。 那如何来做很简单首先第一步先导入这个 fs 模块儿这一步是固定的导入完毕之后下边第二步是创建一个写入流对象。 const 名字的话可以随便写这里我把名字定义为 ws 等于一个 f s. createWriteStream。 首先先介绍一下这个方法的名字 create 单词的本意是创建的意思而 write 单词的本意是写入的意思。 stream 单词的本意是流的意思。 这里它接收一个参数这个参数就是文件的路径我们写上就是这个观书有感.txt。 这个操作相当于跟这个文件建立一个通道相当于是我们跟这个文件建立一个通道什么时候想写就往这个通道里边。哎去传入一个内容就可以了 那怎么往这个文件当中去写入内容这里就要借助于另外一个方法它的名字叫做 write。好我们可以这样来做 ws.write写上半亩方塘一鉴开。哎这是写一句我们可以再调 write 写第二句然后天光云影共徘徊。可以再写第三步然后问渠那得清如许最后一句为有源头活水来。 好等我们把这个写完之后最后一步就是这个关闭这个通道来一个 ws.close 保存好了。 那么下边儿的话我们来看一看效果怎么样右键终端打开然后 node 3- table 敲回车儿大家可以看一下观书有感已经有了点开它内容也已经在里边写入了 但是没有换行 没关系我们可以在每一行的后边添加一个\r\n 这样一个符号我们再重新写入一次敲回车大家可以看一下观书有感这个内容就已经是写入完毕了。 那么这种写入方式跟我们之前的 writeFile 它有什么区别呢 我来说一下这种写入方式它更适合于写入频次较高的场景。我来给大家举一个例子你比方说强哥不会做饭但是天宇老师他会做饭比如说今天我想学习一个西红柿炒鸡蛋然后我会给天宇打一个电话打通电话之后我就问他天宇你会不会做这个西红柿炒鸡蛋他可能会跟我说他会做我说这第一步该怎么做他可能跟我说强哥你先去那去洗洗西红柿这是第一步。好我去洗西红柿了。这个时候为了提高通信的效率我会做一个事情就是不挂断。什么叫不挂断就是一个通道我不断开然后我什么时候想问我就再给他发一个比方说下一步怎么办他说打鸡蛋再下一步然后放油再下一步比如说放这个鸡蛋就是我们在建立通道的情况下通信起来是非常非常方便的。而我们之前所用的这个writeFile它就是一次性的。比方说我要写入文件了好跟文件建立连接然后写入完毕之后就断开这个连接了。你下次你再去调 writeFile他还得跟这个文件建立连接然后再断开。所以说这种流式写入它更适合这种写入频繁的场景而 writeFile 它更适合这种写入频次相对较少的场景。 当然这里强哥还提到了一个流式写入也适合大文件的写入这个得结合后边的流式读取才能看到效果好。那么这里还有一个补充点强哥想说一下子就是关于 ws.close就是这个 close 的方法它的调用其实在这里是可选的我们可以来看看效果。 比方说我手动的将这个文本去掉注释掉 然后我们去执行这个代码敲回车执行完之后我们去看这个文件你发现这块内容它也成功的写入了这是怎么一回事其实就是当它在当这个脚本在执行完毕之后整个的这个资源也会被回收这个通道也会被断开而这个内容也已经写入完毕了所以说这个 close 我们加也可以不加也是 OK 的。 020_fs模块_文件写入应用场景 hello大家好我们来介绍一下文件写入的应用场景顺便说一下将来我们在写代码时应该什么时候想到文件写入。其实文件写入这个操作在日常使用计算机的过程当中还是十分的常见的只不过大家在平时用的时候并没有怎么在意。 比方说咱们来看第一个场景下载文件这个下载文件它就用到了文件写入。比方说咱们用浏览器去下载一个视频这个服务器会把视频的信息返回给浏览器然后浏览器在接收到信息之后就开始往文件当中去写入比方说强哥的电脑在下载文件的时候就是把文件存到了下载这个文件夹里边你可以看一下里边有图片有安装包是吧还有视频之类的这是第一个场景文件的下载。 其二是安装软件这个安装软件它其实也是文件写入的一个过程。当时咱也看了一下那个英雄联盟我是把这个程序装到哪儿了装到了 d 盘的文件夹下边可以看一下。那对于 QQ 和 QQ 音乐来说他们的安装其实也是写入硬盘的一个过程比如说 QQ 音乐咱们可以来看一下它也是存到了这个 d 盘下边。 好那么再有就是关于这个保存程序的日志咱说这个Git以 Git 来为例举一个例子比方说这里强哥有一个文件夹里边写了一些文件我想的存档怎么办右键 gate Bash 打开之后 然后我开始 gate init 敲回车。你看当我们运行 git init 之后这里就多了一个目录 并且里边还多了几个文件那这文件哪来的其实文件也是由程序创建并且往里边写入了内容的。 那再比如说我们打开命令行做一次提交来一个 git add -A你看 git add -A  之后他会把这些文件做一个存档存到哪存到这个 object 文件夹里边你看这里边多了一些文件那这些文件其实就是通过程序写到这个文件当中的。 再比如说给你举个例子我们再来一个 gate commit -m init 然后然后敲回车运行完成之后大家可以观察一下这里有一个文件这个文件就是这个 logs 文件。 我们打开这个head 大家可以瞅一眼好然后把它拿过来往这放你看里边多了一段内容并且这里还有一个什么INIT 这个信息又是怎么来的它其实也是通过文件写入的操作来实现的。 当然了我得说一下这个文件写入它用的并不是 fs 模块它是用来着人家程序的这个写入的功能。 好这是一个程序日志的场景它也用到了文件写入。 再比方说咱们通过编辑器去保存文件这个时候也用到了文件写入比如说咱们通过 vscode 打开一个文件往里边放一些内容比如说放一些分割线写完之后我们 Ctrl s你看我们一摁 Ctrl s其实它就把这些内容写入到了我们那个文件当中其实就是写到了这个文件当中。所以你看平时自个没有怎么多想那底层它确实是实现了文件的写入。 再比方说我们的视频录制也是用到了文件写入大家可以看一下强哥的录完视频就把它放到了这个文件夹里边然后这文件怎么来的其实也是文件写入来完成的。 好了那这咱们说了一下文件写入的场景那么将来我们在写代码的时候什么时候应该想到这个文件写入呢 这里给大家总结了一个规律就是当需要持久化的保存数据时应该要想到文件写入。再说一遍当需要持久化的保存数据时应该要想到文件写入。这里我顺便补充一下并不是每一次用文件写入都能够实现你的目标但是你朝着这个方向去想是绝对没有错的。好了那么关于文件写入的一个场景介绍以及我们什么时候应该想到这个文件写入我们就先说这么多。 021_fs模块_文件读取 hello大家好我们来学习一下使用 fs 模块儿进行文件的读取我们主要会讲两个方法一个是 readFile另外是 readFileSync 上边这个是进行异步读取而下边这个是进行同步的读取。 我们来说一个需求就是这里有一个观书有感.txt这是我们之前已经写好的文件内容了。下边儿的话我们打算通过 4-文件读取.js 这个脚本去读取观书有感.txt 的文件内容 并且在控制台里边儿做一个输出这是我们的一个需求。 好那么下边的话我们来看看如何使用 fs 来实现这个效果。首先要先引入 fs 模块儿这一步少不了, const fs 等于一个 required(fs) 。下边我们先来一个异步读取 fs.readfile 括弧。 首先咱们先解释一下这个单词的含义这个 read 它单词的本意是读取而 file 单词的本意是文件加起来就是读取文件。 然后这个方法它在调用时接收三个参数有两个是必填的一个是可填的分别是文件路径还有配置对象以及回调函数。这个配置对象是一个可选参数这里的话我们用不到它所以先不给它传参好写两个参数。 第一个参数是文件路径我们要读的文件是 观书有感.txt。好然后下边儿回调函数这个回调函数我需要单独说一下它有两个形参当然了两个形参名字你可以随便写你这写a这写 b 都没有问题。等他读取到文件内容之后这个回调函数会被执行并且会传两个值进来。这个 error 它用来接收错误的信息这个 data 用来接收读取的文件内容。 好这个 error 的情形其实跟我们之前写入文件那个是一样的所以我们可以做一个判断如果说要是一个错误对象那我们就做一个输出对不起读取失败然后我们写一个return。那么其次如果 error 要是为null表明它已经读取成功我们就可以打印一下读取它的文件内容。 好下面的话我们来执行一下。这个 js 文件。打开终端然后 node 4- TAB 敲回车大家可以看一下这个读取到的内容它是一个buffer 这个 buffer 具体长什么样子我们可以把它转成字符串用这个 toString 以 UTF-8 的编码方式对其做一个字符串转换 按上撤回车大家可以看一下就读取到了没有问题。 好那么除了这种读取方式之外还有另外一种读取方式就是同步读取好 let data 等于fs. read FileSync 括弧它接收一个参数就行了就是文件的路径来一个观书有感.txt。 然后可以console.log打印一下 data 这个变量这个 data 就是读取到的文件内容不过它的值跟刚才那个一样也是一个buffer如果你想看一看字符串儿的形式必须得在后边儿加一个 to string 好然后我们摁上敲回车来看看结果哎没有问题。 好那么其实到这儿呢同学可能还是会有一个困惑说这读取文件内容我直接一点他不就看到文件内容了吗这为什么我还要拿脚本去读取它呢 这里我再解释一下子跟咱们之前文件写入那个场景其实是一样子的主要是为了实现自动化。我来举一个例子比方说咱们将来做一个网站啊用户通过浏览器来访问咱这个网站打算要访问一下咱这个网站下边 1.html 的文件内容。那你想人家要访问这个你不能说兄弟你等着我去给你打开然后我发我再发给你这个明显不现实所以我们可以通过脚本来做。哎用户的请求过来之后由脚本去读取文件内容然后读取完毕之后再通过网络把信息返回给用户的浏览器就可以实现自动化了。所以说并不是大家想的那样子我直接打开也能看到那个情况是不一样的。 022-文件读取应用场景 我们来介绍一下读取文件的应用场景这里列举了一些当然并不是只包含这些比如说第一个就是电脑开机这个咱们当时讲过电脑在开机之后需要首先将磁盘里边的内容先读取到内存当中然后 CPU 才可以对程序去做一个运行这是一个。 第二个就是程序运行比方说咱们去运行这个游戏是吧咱们当时讲过这个东西诶比方说我想运行一下英雄联盟双击之后它里边的程序相关文件就会载入到内存当中其实也就是从硬盘当中在硬盘当中将那些文件数据全都读出来然后载入到这个内存里边去。 好那么其次就是编辑器打开文件举一个例子打开编辑器比方说我想看一看第五这个 js 文件 我们点击一下右边儿就会出现这个内容那么大家要思考这个内容是哪儿来的那么其实这些内容都是从文件当中读取出来的然后把它呈现到了这个位置所以说在咱们平常不起眼的地方都有文件读取的操作。 那再比如说查看图片播放视频播放音乐同样是如此比方说咱们桌面儿有一张图片打开可以看一下儿那么其实也是一样子。 当我们双击之后首先这个看图软件儿它会先运行然后看图软件在运行之后会把这个文件内容读取出来然后把里边的信息做一个解析最后呈现在这个窗口当中。 好那么再比如说 git 查看日志这里的话强哥也专门准备了一个仓库咱们双击打开它然后右键 GitBash 打开之后的话我们去运行命令 git log 敲回车。 那之前接触过 git 的同学应该知道这个命令是用来查看我们的历史提交记录的里边包含了这个内容什么时间等等一些信息。 那有一个问题这些信息哪儿来的平白无故生成的并不是它其实是到这个文件夹当中把一些文件里边的信息取出来 取出来之后再在这个窗口去做一个呈现是这么一回事儿。 好再比如说上传文件我们通过百度网盘是吧准备上传一个文件那上传文件怎么回事儿其实也是一样它需要把本地那个文件的内容需要读取出来读取出来之后再通过网络把这个信息传到服务端去。所以说上传文件的时候也会用到文件读取。 再比如说查看聊天记录用过QQ、用过这个facebook的同学应该都知道我想看看跟某个人的聊天记录怎么办哎可以拿点击查看历史是吧就是查看聊天记录就会出现这样一个窗口我们可以在里边看到历史的一些聊天记录。 那么这些聊天记录它在哪儿存的有的当然不得不承认有的是存储在云端的存储在服务器但是大多数聊天记录都是存储在本地的。我记得当时腾讯 QQ 还出了一个什么出了一个这个会员的一个特权就是如果你开会员的话能够漫游就是漫游所有好友的聊天记录那个的话其实是保存在云端的。 那如果说你要是没有充会员没有充会员这个聊天记录它就只保存在你的本地电脑的文件当中好了那么关于读取文件的应用场景我们就先说这么多。 023_fs模块_文件流式读取 hello大家好我们来学习一下使用 fs 模块儿进行文件的流式读取。这里主要是用到一个方法它的名字叫做 createReadStream。 那什么是流式读取我们首先来介绍一下子这里画了一个图这个大黑框当然可以换个颜色比如说红框我们把这个红框假设为是一个文件。 流式读取就是读的时候一块儿一块儿的读就是我先读一块儿诶然后读完这块儿之后我再读另外一块儿读完之后我再读另外一块儿。它是这样子一块儿读的而我们之前那个 readFile它是一次性的把这些内容全都读取到内存当中所以两者读取方式还是不太一样的。 好下边的话我们来举一个例子比方说我们有一个需求这个需求是将资料文件夹当中笑看风云.mp4这个文件把它读取出来载入内存。 好那么怎么来做首先第一步还是引入我们的 FS 模块儿 const fs   required(fs)这是第一步。 下边第二步是创建这个读取流对象 const rs当然了这个名字变量名你可以随便写等于一个 fs.createReadStream。然后我们首先来解释一下这个单词什么意思它是由三个单词组成的 create 是创建然后 read 是读取 stream 是流的意思。 而这个方法它接收一个参数就是要读取的文件路径这个路径稍微注意一下因为这个 mp4 文件和我们的 js脚本并不是在同一个文件夹下所以我们要先回到上一级目录再去资料里边找这个 MP 4 文件所以路径我们可以这样去写来个 ../ 然后资料下边儿是笑看风云.mp4。好这是我们的第二步创建读取流对象。 第三步我们要为这个读取流对象绑定一个 data 事件这个 data 事件用来获取读取到的数据怎么来做就是 rs.on注意绑定事件这里你要用 on 方法然后里边这个事件的名字叫data。 第二个参数是一个回调函数这个回调函数有一个形参名字叫trunk当然这个名字可以随便写官方是把这个名字起成了trunk这个 trunk 单词本身有块有大块儿的意思。 好那么下边我们来说一下这个回调函数它什么时候执行就是当从文件当中读取出来一块数据之后就会执行一次回调。刚才我们说了流式读取就是一块一块的读我先读一块我再读一块而这个回调函数是每当读完一块之后就会执行这个回调函数并且会把读取到的内容传递给这个行参让他去执行让他去处理。 所以我们在这里可以使用 console log 来打印一下 trunk 这一个变量。 好那么下边我们来运行一下这个 js 文件打开终端然后来一个node这是 5 杠 table自动补全 敲回车大家可以看一下控制台就输出了很多的buffer这就是我们从文件当中所读取到的内容。 那同学可能会有一个困惑说那我每次从文件当中读取的究竟是多少数据 这里的话我们可以通过一个 length 属性来获得这个 buffer 的长度我们来看一下再来摁上敲回车大家可以看到这个值是65536那么这个 65536 它的单位是字节而这个 65536 字节对应的是 64 k b。也就是说这个流式读取每一次在读的时候它会从文件当中读取出来 64 kb 的数据。大家同学可能会说那为什么最后这个是118这原因很简单就是因为最后那一块不够了不够 6536 了就把剩余那个数据给读取了出来。 当然有同学可能会说那我想看看这个 buffer 里边长什么样子我来个 toString 行不行这里我解释一下这样做是得不到你想要的结果的大家可以看一下这是一堆的乱码。 为什么会乱码这是因为在文件当中或者说在这个 MP4 文件当中它存的是视频的信息它并不是大家所想的 UTF- 8 的字符信息。所以你强行把这个视频信号转成字符信号我们是看不到一个正常的文字结果的这是我们补充了一下这个点。 其次我们再说一个点就是当我们的读取流在把内容读取完毕之后它还会触发另外一个事件这个事件的名字是end我们写一下 rs.on然后and当然了这个 end 事件它是一个可选的事件并不是说一定要绑定这个事件。给大家补充一下这个点为后边也是做一个铺垫。 好我们来做一个输出来读取完成保存我们来看效果怎么样然后摁上敲回车然后结合上面这个data事件结合上面这个然后摁上敲回车。 大家可以看一下读读读读读读完之后这里执行这个回调函数显示读取完成然后同学可能会想说那这种读取方式它有什么用 给大家说一下这种读取方式在读取大文件或者处理大文件的时候它可以提高整体的效率当然在这个案例里边大家可能体会不出来唉怎么就提高效率的啊这个大家先不要着急等下一个小节我们做一个练习啊结合一下子你就能感受出来这个流式读取它确实是可以提高读取的效率的。 024_fs模块练习_文件复制 hello大家好我们来做一个 fs模块儿的练习打算来实现一个复制文件的效果。我们来看一下需求我们的需求是打算复制一下资料文件夹当中的笑看风云. mp4 这个文件 下边儿的话我们首先用第一种方式来实现一下子这是方式一准备用这个 readFile 来做那这个文件复制其实逻辑很简单就是把这个文件的内容我们取出来取出来之后再写到另外一个文件里边就完事了。 那我们先做第一步就是读取文件的内容。 let data然后等于一个fs当然我们这里没有导入先把它导进来。 const fs 等于一个 required(fs)。下边这里我们 fs.readFileSync。为了方便我们这里使用同步的 API 。路径这一块的话文件和 MP4 文件它们两个并不在同一个文件夹下所以说我们这里写相对路径点点杠然后资料下边是笑看风云.MP4。 读取完文件之后下边儿做第二件事情就是写入文件。好我们来一个fs.whiteFileSync 往哪个文件里边儿去写我们准备来一个笑看风云2.mp4。好那路径的话我们可以这样去写我这一份儿拿过来资料文件夹中的笑看风云.mp4路径这儿来一个杠2。好这是文件的路径。 第二个参数是要写入的文件内容我们把读出来的数据拿过来放在这然后把这个数据写到新文件里边就可以了。 好下边我们来看看效果怎么样。右键终端打开然后 NODE 6 杠 TABLE 敲回车。大家可以看一下这个笑看风云 2 就来了 我们可以呢打开这个文件夹去看一看这个 2 能不能播放双击打开。 好好大家可以看一下这个是没有问题的复制已经成功了 这是第一种方式我们用 readFile 来做。 下边我们用第二种方式来实现一下子 方式二用这个流式操作那流式操作这个思路也是一样子的就是要读读完之后再写。 我们首先创建一个读取流对象 const rs 等于 f s.createReadStream 那个文件的路径我们复制一份儿把它读出来。 然后我们再创建一个写入流对象 const ws等于fs.createWhiteStream。这次我们来一个笑看风云三.mp4 就是往这个文件里边去写内容。那两个流对象我们在创建完之后接下来我们开始读一点写一写 为这个读取流绑定事件绑定 data 事件然后来一个 rs .on data 回调函数放进来每读一点儿我们写一点儿来一个ws.white 括弧儿把这个 trunk 放进来。 好那么接下来的话我们一起来看看效果怎么样直接按上敲回车大家看一下这个笑看风云 3 已经出来了我们点开文件夹去看看效果。好大家可以看到这个视频也是可以播放的。 说明一点我们这个写法也是 OK 的那么两种写法哪一个会更好一些其实第二种方式流式操作它会更好一些它所占的资源会更少一些。 为什么呢咱们来捋一捋这个思路你看咱先说第一种方式它是把这个文件的所有内容全部都读到了内存当中然后再把这个数据写到文件里边。那这个文件多大这个文件 70 多兆大家可以看一下 77. 8 兆也就是说它至少要占据 77. 8 兆的内存空间。 然后但是我们来看看第二种方式是流式的读取与写入这种方式的话它的理想状态。注意我说的是理想状态它只需要 64 kb 的内存空间就可以完成文件的赋值因为它每次它只取64然他往这个文件里边去写取一点写一点所以说他理想状态下只要有 64 KB 的内存空间就可以完成这个复制。 那为什么说它是一个理想状态是 64 k b这是因为我们的读取速度一般都会比写入速度要更快所以它把数据读取过来之后往里边写还没等他写完第二块数据就读进来了所以就会形成这么一个局面这里换一个方式给大家来演示。 比方说我们打算往这个文件里边去复制左边图示文件复制到右边文件那么这种读取流的方式就是它读一点儿然后写一点儿读一点写一点然后读一点写一点。当然这是一种理想状态它只占这 64 KB 的空间但是我们说了它这个读取速度一般都要比这个写入速度要快虽然等这个还没写完另外一个就过来了内存读入了多块他这个去写入这个读然后这个读这个读是吧这个写所以理想情况下是 64 kb但是即使是这样子它所占的内存空间也比整个文件的内存空间要小。 给大家写一个代码演示一下子我们这里去导入一个模块儿叫 process required 一个process这个 process 也是 nodeJS 的一个内置模块儿我们可以通过它里边儿的一个方法来获得代码儿运行的一个内存占用量。 好我们先看上边儿这个代码儿的内存占用量把它复制一份儿然后我们这里输出一下子叫process.memoryUsage() 。 memory 的话单词的本意是内存的意思而 usage 是使用量的意思。 好我们来看看效果怎么样。按上敲回车这一块给的是一个对象然后这里我说一下你不必去看所有只需要看这个 rss 就行了这个 rss 是整个占用内存的一个大小它这的话是 110 什么什么滴我们拿过来单位也是字节我们可以来算一算这个数字它对应的这个内存到底是多少好然后 control v然后除以一个1024等于这是一个KB我们再除以一个1024等于这是一个兆B所以这个代码运行完之后它整个内存占用是 105 兆B 的内存 105MB 好我们把这代码注释掉来看一看下边这个代码它的一个内存使用量。 把这个代码咱打开之后我们不能在下边去直接去写为什么呢因为这代码还没有执行这是一个异步的回调所以我们正确方式应该这样去做rs.on end等把这个文件都读完之后再去统计这个脚本它总共消耗的内存的这个资源。 好我们把代码复制一份然后拿过来放在这然后摁上敲回车看看这次它的内存占用量是多少。好把它复制一份。拿过来拿过来之后咱们也算一算然后打开它粘过来然后除以 1024 等于这是个KB再除以 1024 等于这是一个兆b它总共的这个内存占用的话是 41 兆。 大家可以看一下这两个脚本我们两种方式它们的占用内存空间是它的 105 - 41就是 60 多兆的内存差距。那我们是通过这种方式给大家对比了一下两种代码两种写法的一个差异那明显是流式这种操作它占用内存空间会更少一些。 好那么其实这里还有一个简便操作来给大家演示一下子这种写法还有一个简便写法就是我们可以直接这样做 rs 读取流直接调这个 PIPE 括弧里边儿跟一个ws用这种方式也可以快速实现这个复制。 这代码什么意思我们先看一下读取流把这个数据读取完之后交给写入流交给写入流这个 pipe 单词的本意是管道的意思管道就是我这儿把东西取出来通过管道传递给你这个写入流是这么一个意思。当然了这个内容的话我们用的并不是特别多所以大家以后看到这个代码知道是什么意思就可以了。 025_fs模块_文件重命名和移动 hello大家好我们来学习一下使用 fs 模块对文件进行重命名和移动。 那主要用到一个方法叫做 fs.rename当然了还有一个同步的版本叫 fs.renameSync。下边我们来实现一个效果就是在此之前我们写过一个座右铭.txt 这样一个文件现在我们想通过脚本将这个文件的名字改成论语.txt。那么下边儿我们通过代码儿来实现一下子。 首先第一步的话我们还是要导入这个 fs 模块儿。const  fs然后等于一个 required(fs)。 第二步就是调用 rename 这个方法。先说一下这个 rename 它单词是什么意思 rename 单词的本意就是重命名的意思 然后这个方法它接收三个参数 第一个参数是文件的旧的路径你也可以认为是要修改的文件路径我们这个文件是座右铭.txt我们写成相对路 ./杠左右铭.txt。 第二个参数是这个文件的新路径我们把它定义为是论语.txt 也在当前文件夹下。 第三个参数是一个回调函数而且只有一个行参error它的这个特点跟之前写入文件和读取文件是一样的我们这里可以做一个判断如果说有错误我们来一个提示来一个操作失败我们 return 停止脚本。反之我们来一个提示来一个成功的提示操作。 那么代码写完了接下来我们运行一下代码右键终端打开然后 node 空格 7 杠 table 敲回车大家可以看一下这个时候我们那个文件名就由那个座右铭改为论语.txt这是一个重命名的操作 除了可以进行重命名之外这个 rename 还可以进行文件的移动。我们来举一个例子 比方说我们想把这个 data.txt 移动到资料文件夹当中可以看一下资料文件夹里边目前是没有这个文件的。 好我们写一下 fs.rename旧的文件路径是点儿杠 data.txt新的文件路径是 ./然后资料下边儿的 data. txt。注意这个名词不能省你不能说我光写一个资料这样子做是不可以的。好然后第三个参数还是那个回调函数这个代码跟上边是一样的所以我们直接把这个代码 copy 一份拿过来。接下来我们看效果怎么样。 来一个 node 7 杠 table 敲回车大家可以看一下这个文件刚才还在这儿现在就到了资料这个文件夹下了。 其实重命名和移动文件的本质是一样的都是在更改文件的路径。大家同学可能会说那我什么时候会用到这种操作我直接拖拽不就行了吗这个情况其实跟之前的文件写入和文件读取是一样的就是为了实现自动化比方说咱们要做一个网盘用户希望把这个文件名改一改不能说我后边安排一个程序员手动的帮用户去更改文件名或者说去移动文件这明显是不太现实的我们终究还是要借助于脚本自动化的完成文件的重命名和移动。 当然了这个 rename 它还有一个同步的版本就是这个 renameSync这里的话我们就不再演示了它的特点跟原来的同步异步特点是一样的就是没有这个 callback 回调函数而已。 026_fs模块_文件删除 hello大家好我们来学习一下使用 fs 模块对文件做一个删除操作这里我们会用到一个方法叫做Unlink待会儿的话会给大家再补充一个删除的方法。 首先我们先举一个例子比方说我们想把观书有感.txt 这个文件把它删掉怎么来做首先第一步还是要导入我们的 fs 模块儿 const fs 等于 required fs 。第二步是调用这个 unlink 方法 fs.unlink 单词的本意是链接而 unlink 是取消链接的意思。 好然后它里边儿其中两个参数 第一个参数是删除的文件路径 第二个是回调咱那个删除的文件是观书有感在当前文件夹下所以我们写成点杠观书有感.txt。第二个参数是一个回调函数跟之前的回调是一样的先做判断 console.log如果说出现问题我们提示删除失败然后顺便 return 停止代码如果说要没有错误我们提示一个删除成功。 好下边我们来运行一下第八个 js 文件来一个 node 8 杠 table 敲回车大家可以看一下那个观书有感.txt 就被删掉了。 那么除了这个 unlink 可以删除文件之外它还有另外一个方法也可以删除就是这个 rm 方法。这个方法是 node g s 14.4 版本所引用的一个新方法我来给大家演示一下子 fs.rm 那这个参数跟上面儿个参数是一样的。 然后第一个参数也是要删除的文件路径这次的话我们把论语.txt 把它删掉。 第二个参数跟上面那个参数是一样的也是一个回调函数。为了方便直接把代码复制一份然后把注释去掉格式化一下子。好我们来看看效果怎么样。摁上敲回车大家可以看一下这个论语.txt 就被我们给成功的删掉了。 那顺便补充一下 unlink 和 rm 有什么区别呢它们都有自个儿对应的同步的方法上面这个叫做 unlinkSync下边这个叫做rmSync。 同学可能还是会有这个困惑就是说我明明可以右键删除的那为什么我还要用脚本去删除呢主要还是为了实现自动化比方说做一个网盘系统然后用户说我要删这个文件你不能说我给你安排个人儿是吧手动去给你删除真不现实。再比如说用户可能会删除一些缓存删除一些缓存文件那我们也可以通过脚本自动化的来完成这些文件的删除。 027_fs模块_文件夹操作 我们来学习一下使用 fs 模块进行文件夹操作这里我们主要会学习三个操作 第一个是创建文件夹 第二个是读取文件夹 第三个是删除文件夹。 下边的话我们首先来看第一个就是这个创建文件夹我们打算在代码这个文件夹下创建一个 html 的子文件夹。 怎么来做首先第一步要先导入 fs 模块这个是固定的 const fs 等于 required fs 。第二步我们开始去创建这个文件夹来一个 fs.mkdir这个 mk它是 make 单词的一个缩写意为制作 dir 是 directory 单词的缩写意为文件夹加起来就是制作文件夹的意思。 而这个方法它接收三个参数第一个是文件夹路径第二个是配置的对象第三个是一个回调函数这个配置对象它是一个可选参数咱们这儿目前还用不到所以就先不传它了。 好写第一个文件夹路径 ./html因为是要在代码这个文件夹下跟咱这个 js 文件是统一的所以说我们写一个点杠。好那么第二个参数咱不用直接写第三个参数 error 做一个判断 if error然后 console.log 打印一下子就是创建失败并且用一个 return 停掉代码然后如果说没有错误我们 console.log 来一个创建成功。 OK搞定下边的话我们来运行一下这个 js 文件来一个 node 九杠 table 敲回车大家可以看一下这个目录就创建成功了。 那除了可以创建这个单个文件之外它还可以进行这种递归的创建。 来给大家演示一下子 2- 2 递归创建 怎个递归创建法比方说我们在这个代码文件夹下边想创建一个 a 目录然后 a 目录里边想直接创建一个 b 目录然后 b 目录里边直接创建一个 c 目录打算这么去做。 好我们首先把代码 copy 一份拿过来然后路径咱们稍微调一下这我写个a然后斜杠b斜杠c这是咱们所谓的递归创建咱们先试一试看直接创建行不行然后按上返回车大家可以看一下这里显示创建失败也就是说你直接这样去递归创建是不可以的。 要想递归创建怎么办我们需要添加第二个参数就是那个配置对象加一个属性叫 recursive。 这个 recursive 什么意思它是递归的意思就是表明我要递归创建创建完a然后去创建b创建完b然后去创建c好我们来试一试。摁上敲飞车大家可以看一下这个a、b、 c 三个目录就创建成功了。 同学说这个展示的效果跟我预想的不一样能不能把它们竖着去排列显示 这个是可以的我们点开齿轮儿点击设置在这里可以去搜这个compact搜完之后大家可以看第一个选项控制资源管理器是否以紧凑形式呈现文件夹 他说对 Java 包结构非常有用咱们这写前端的所以说咱们把这个勾取消把这钩取消之后你就会发现 我们这个文件夹的这个折叠情况就没有了。 好这是关于文件夹的两种创建一个是创建单个一个是递归创建。 下边的话我们来说一下关于文件夹的一个读取这里我们来个 2 - 3 读取文件夹比方说我们想看一看资料文件夹当中都有哪些资源怎么办 我们可以这样来做 MS 点 readdir这个 read 单词的本意就是读取的意思而 dir 咱们说过它是 directory 单词的缩写是文件夹的意思。 而这个方法在调的时候它接收两个参数第一个是路径咱们写成 ../资料。第二个参数回调函数这个回调函数它有两个参数一个参数用来接收错误信息一个参数用来接收读取到的文件夹内容还是一样我们做判断如果 error 做一个提示读取失败然后写一个return那如果说没有错误我们打印一下 data 它的一个值。 好我们来看看能不能读取到资料。好那么接下来我们来运行一下子摁上敲回车。好大家可以看一下这个返回结果它是一个数组而数组里边的内容是这个文件夹当中资源的名称 所以通过这个方法可以得到目标文件夹当中资源的名称列表。 好了这是关于读取操作当然了这个读取并不说只能读取它其实任意一个文件夹咱们都是可以读取的比方说我读取当前文件夹可不可以诶这也是 OK 的比方说这里写一个./然后摁上敲回车 大家可以看一下当前文件夹的这个文件列表我们也是可以获取到的。 好这是 readdir那么下边还有一个操作是删除根据夹 2 - 4 是删除文件夹比方说咱们现在想把 html 这个文件夹给它删掉怎么办那是 fs. rmdir 括弧这个 rm 它是remove单词的一个缩写意为移除。dir它还是文件夹的意思。然后里边两个参数第一个是要删除文件夹的路径 ./html第二个参数是回调函数它只有一个形参那这里还是一样 error 提示来一个删除失败然后 return 代表儿这里我们输出一下删除成功。 好我们来尝试运行一下这个代码大家可以看一下这个 html 就被删除了 那如果我们删完之后再去运行还能不能行来试一试按上敲回车它显示删除失败为什么呢因为这个资源它找不到了。 好这是一个单个的删除那么下边我们再来说一下这个递归删除复制一份然后拿过来把上面的代码注释掉这是一个递归删除。 比方说我想把这个 a 删掉注意看我想把 a 删掉注意我只写了a没有去写这个b c 路径就是我希望它能够自动帮我把 a 这个文件夹整体都删掉。咱们先看看行不行然后摁上敲回车。大家可以看一下这是一个删除失败 那错误的信息是什么呢咱们可以把这个 error 的对象打印一下。 好然后摁上跳回车大家可以看一下这个这是那个 error 的值它是一个对象。然后前面这个中括号它是一个错误的信息说了这个 directory not empty他说文件夹不空不是空的不让你删。 那么这个时候的话我们可以借助于一个配置对象来完成递归删除那这个值跟刚才递归创建那个是一样的也是 regular SIM来一个处保存好我们来看看效果怎么样然后摁上敲回车。 大家可以看一下这个时候那个 a 目录就被我们已经给删掉了但是它这里有一个提醒说了 deprecation warning 是一个不赞成的提醒若in future versions of nodejs 在将来的 nodeJS 版本当中 fs. rm recursive true will be removed意思就是说这个东西将来会被移除那他说建议你使用 fs.rmdir 去删除意思就是说不建议你一直使用这个了它将来会被移除。 然后建议你使用这个rm这个 rm 咱们当时在删除文件时也是使用过我们来演示一下怎么做好然后建议使用然后上边rmdir这个是不推荐使用。 好然后我们这里新建一个文件夹手动建来个 a文件夹a 里边的话我再建一个 b 文件夹里边我再建一个c文件夹。 然后接下来咱们使用 rm 删除看看还有没有这个警告然后摁上敲回车大家可以看一下删除成功没有问题也没有那个提示的警告了。 好了那关于文件夹的这个三个操作一个是创建一个是读取一个是删除。 028_fs模块_查看资源状态 我们来学习一下使用 fs 模块儿来查看某一个资源的状态。这里主要是会用到一个方法它的名字叫做 stat 这个 stat 它是单词 status 的一个缩写意为状态。 下边我们通过代码来给大家演示一下这个方法的使用。比方说我们现在想查看一下资料里边儿笑看风云点儿 MP4 这个文件的状态怎么来做首先第一步要先导入 fs 这个模块儿 const fs required fs。第二步是调用这个 stat 方法我们说过它是 status 单词的一个缩写意为状态 fs.stat 里边儿我们传两个参数第一个参数是文件的路径./然后资料下边儿的笑看风云.mp4。 第二个参数是一个回调函数这个回调函数有两个参数第一个参数是错误的对象第二个参数是文件的状态信息它也是一个对象。好我们还是按照之前的方式一样然后先判断一下是不是有错误如果说有错误的话来一个提醒操作失败然后通过 return 来停止代码继续执行。如果说没有错误的话我们来输出一下这个读取到的状态信息。 好那么接下来我们打开终端去运行 10 这个 js 文件来一个 NODE 10 table 敲回车大家可以看一下这里并没有提示操作失败就意味着我们操作已经成功了。 然后 data 的输出结果是这样的一个对象里边包含了很多的信息我们来看一些对于我们来说有用的一些信息。比方说这个 size 是来查看文件的大小的 然后还有一个是最后这个 birthtime是这个文件的创建时间。 然后还有一个是这个 atime 是最后的访问时间 mtime 是最后的修改时间。还有一个是 ctime这个是最后一次修改文件状态的时间是关于文件的一些相关的信息。 那么其实除了这个之外我们还有一个操作就是可以获取文件的类型。这里有两个方法第一个方法是这个 isFile用来查看这个资源究竟是不是一个文件。好我们来输出一下子data.isFile我们来看看效果怎么样然后摁上敲回车可以看一下这个返回结果是一个true由此表明这个目标资源是一个文件。 当然还有另外一个是 isDirectory用这个方法可以检测目标资源究竟是不是一个文件夹。好写一下 isDirectory。好我们摁上敲回车看一下看第一个是一个true第二个是一个false。好是我们通过 stat 去查看了一个资源的状态。 那么其实这个方法我们用的并不是特别的多为什么讲这个来给大家展示一个东西我们打开资源管理器这是代码文件夹的一个显示的内容这是文件名称创建时间修改时间类型还有大小你会发现这些信息我们通过 fs 模块都是可以获得的前面这个左边框选我们可以通过 readdir 右边框选来获取而后边这些我们可以通过 stat 去获取。 所以说将来我们可以通过代码来获得这个文件的所有的信息不用这个资源管理器也是可以实现的。 029_fs模块_路径补充说明 我们来介绍一下 fs 模块当中的路径这里的路径主要有两种写法 第一个是相对路径 第二个是绝对路径。 当然了这个路径我们在之前学习 html css 的时候已经是接触过一些了不过那个路径跟这个路径还是略微的有点不太一样的。 来给大家演示一下子举个例子比方说我们打算在代码文件夹下新建一个 index.html 的文件那么该怎么做首先第一步我们先导入 fs 模块儿 const fs 等于一个require fs。首先先给大家演示这个相对路径 fs.whiteFileSync 括弧我写成 ./index.html写入内容我们来一个 love 保存好我们接下来运行 11 这个 js 文件来个 node 11 table 敲回车。 好大家可以看一下这个 index 点 h t m l 我们就创建成功了。这是第一种相对路径的写法那么下面我们来演示第二种写法可以不写点杠这个不写点杠的效果跟跟上面这个写点儿杠的效果是一样的都是在当前文件夹下去创建这个文件。好我们来试一试按上敲回车大家可以看一下它还是在当前文件夹下去创建的 index.html。 好。那么下边的话咱们再来看一看另外一种相对路径的写法那就是点儿点儿杠上一级目录。好我们来按上敲回车看效果你会发现这次他就把文件创建到了外层文件夹下了。 这强哥顺便补充一下这个相对路径不是说只有这个 writeFileSync 才可以使用我们之前那些操作都是可以的比方说读取文件、流式读取、流式写入、删除等等操作都是可以用这个相对路径的当然了绝对路径也可以。 那么接下来我们来演示一下这个绝对路径那么绝对路径呢这里也是有两种写法。首先我们先来看第一种写法的话是以盘符开头然后去编写路径比方说这里我写一个 d 盘 index.html写入文件内容还是love那这个代码的意思就是说我们打算在 d 盘的这个文件夹下去新建一个文件叫 index.html 并且写入内容。 好我们来测试一下看看效果怎么样。把这个文件夹放到右侧好然后摁上敲回车大家来看效果你会发现这个 index.html 就创建成功了 这是 d 盘开头的这种写法同学说我写 c 盘开头行不行这个写 c 盘其实是不行的为什么呢不是路径写法有问题而是权限不够我们来试一试大家可以看一下。 这里报了一个错误说 operation not permitted就是说你这个操作不被允许主要还是因为权限好。 那么下边的话我们再来演示一下绝对路径的另外一种写法。这种写法其实是在 Linux 系统下边用的比较多 Windows 下边用的相对来说比较少 就是以斜线开头那么你以斜线开头这种路径它也是在这个盘符的根目录下边也就是最外层文件夹下再创建文件我们来看效果。然后摁上敲回车大家瞅一眼这个 index.html 也是可以创建出来的没有问题。 好那么这里我再说一下那么这个路径它其实是一个相对来说比较繁琐的知识点因为它的情况比较多既有 url 的路径又有fs也就是文件系统的路径。所以很多同学在编写代码的时候对于这个路径相对绝对始终是搞不清楚。大家不用担心到后边会花一个章节把 url 里边的路径和这个文件系统路径再结合起来给大家讲一下相信到那个时候大家能够对这个路径有一个更为清晰的认识。 030_fs模块_相对路径的Bug与解决 我们来演示一下 fs 当中相对路径的一个bug顺便说一下这个 bug 应该怎么去解决还是以上节课那个案例来接着继续。我们还是希望在这个代码的文件夹下新建一个文件名字叫index.html。首先的话我们先把 fs 导进来然后第二步去创建文件并且写入内容 writeFileSync 写一个相对路径./index.html。内容的话我们还是选择用 love 好我们去运行一下子右键终端打开然后 node 12 table 敲回车大家可以看一下此时它是可以把这个文件创建出来的。 接下来的话来演示一个操作就是我打算切换一下命令行的工作目录注意我运行的一个 cd..将工作目录切换到了外层也就是这个 12-fs 文件夹下原本在  12-fs/代码   。那么这个时候我还能不能直接去运行这个命令呢我们来试一试当回事儿大家可以看一下他报错了说 cannot find the module巴拉一大堆他说找不到这个模块儿 其实很正常就是因为在 12 这个文件夹下根本就没有 12-相对路径的bug.js 这个文件所以他找不到他也没办法去运行这个脚本。 那我们在这个文件夹下能不能去运行这个 js 文件答案是可以的不过你要把路径写对怎么写我们可以这样去写 node 来一个 ./代码我们到代码文件夹下去找这个 12 的 js 文件敲回车大家可以看一下是可以运行的但是这个代码运行结果有点出乎我们的意料我们是希望在代码文件夹下边去创建但是他这次却把文件创建在了 12-fs 这个文件夹下。 这是怎么一回事儿我们需要解释一下就是 fs 模块儿当中这个相对路径它的参照物它是比较特别的它参照的并不是这个 js 文件的所在目录。再说一遍这个相对路径它参照的并不是这个 js 文件的所在目录而是参照的命令行的工作目录。也就是说你这里写一个点儿杠当前目录那这个当前目录指的是命令行的工作目录。 下边儿的话我再来给大家说明一下子你看咱们去运行这个代码儿那这个点儿杠当前目录它是跟命令行的工作目录挂钩儿的也就是说咱在这个 12-fs 下的然后你这里跟了一个 index.html所以它在创建文件时就会在 2-fs 是这个文件夹下去给你创建。来我们再试一次把这个删掉然后摁上敲回车可以看一看它会在这里创建。 再来演示一个比方说咱们在文档这个文件夹下打开终端然后node我还是去运行那个 12 js 文件。../先回上一级再去写代码儿再来一个 12 table自动补全Tab我先不运行你可以先想一想这个时候如果说我们去新建文件它会把文件创建在哪个文件夹下 它会把文件创建在文档这个文件夹下来看大家可以看到这个 index.HTIML 就创建出来了。 所以说这个相对路径它还是有一点不太稳定的它会随着你的命令行的工作目录切换而切换。顺便说一下有些同学他喜欢用这个右键用插件去运行文件 其实也会产生一样的问题有同学可能会这样去操作右键让 run code 去新建文件那么这个时候也是达不到自个儿的预期的并没有在代码文件夹中生成index.html。 为什么呢还是因为工作目录所导致的一个问题。好那刚才我们说了相对路径它不太稳定不太靠谱那有没有办法能够解决这个问题 有那就是换绝对路径那么绝对路径每一次手动去写又太麻烦是吧 d 盘然后一层一层往里边写是非常非常繁琐的。这里我们介绍一个新朋友叫做 __dirname。首先咱们先说一下这个__dirname大家可以把它理解为是一个全局变量。 全局变量当然你可以这样理解我在外层加了引号为什么加引号因为它并不是一个真正意义上的全局变量但是大家这样去理解是没有问题的。好然后顺便来说一下这个__dirname 它有什么作用我们来说一下这个变量它始终保存的是躲在文件的所在目录的一个绝对路径这句话有点长我们慢慢再来说一说。 首先这个__dirname它保存是这个 dirname它的所在文件12-相对路径的Bug.js 这个文件的所在目录代码文件夹 的一个绝对路径 我们可以尝试去运行一下看看效果怎么样。 好右键再次终端打开然后 node 12 table 敲回车可以看一看这是咱现在的一个输出结果。 那么现在我切换工作目录然后再来 node./代码 12 table 再去运行你注意观察它还是保存的代码的绝对路径。 那么再比如说我右键通过插件去运行 run code来看一下它保存的还是代码的绝对路径 ​​​​​​​ 所以说这个变量它保存值是没有发生变化的我们可以根据这个路径去拼接最终那个路径形成一个绝对路径。 好把代码复制一份拿过来前面写一个__dirname注意这路径后边没有斜线我们需要把后边这个点去掉就可以完成拼接。 那我们来看看效果怎么样。右键终端打开先来运行 node 12 table 敲回车 看在这儿创建的我先把它删掉 然后我 cd..再去运行 node ./代码然后 12 table 敲回车大家看一下儿也可以。 而且我们右键取 run code 看一下它也可以创建这就是__dirname 的一个效果它不会随着你的工作目录的变化而变化所以我们以后在进行 fs 文件操作时都会加上这个__dirname避免因为工作目录的变化而导致程序运行发生变化。 大家同学可能有一个困惑说不太对劲你看这个路径它的分隔符是反斜线而咱这个路径它这个分隔符是一个正斜线这个不会有问题吗 我说一下这个代码运行是没有问题的但是这个写法其实是不太规范的不过你也不用担心等后边我们会介绍一个方法有了它之后我们就可以让路径变得更规范一些。 031_fs练习_批量重命名 我们来做一个 fs 的练习打算对文件做一个批量的重命名。 之前我们写过 12 个与 fs 相关的文件我们接下来的话打算对 1- 9 这几个文件名字做一个更改 在它的前面补一个0就是由原来的1变成01。 为什么做这样一个事情主要是因为我们这个代码上传到网盘之后它的显示顺序会发生一些问题它在排序时是这么排的一在第一位 10 在第二位 11 是第三位为什么会这样子因为它是一位一位的比较看一都是一它都在前边这个 2 比这个 10 第一位要大所以说它就排后边了。 不过我们可以在这个数字前面补一个 0 来解决这个问题补完 0 之后就会变成这个样子都是一位比较 那 0 在前边儿一位数的文件他们就会排到前边儿了。 好那么下边儿的话我们把这个代码儿复制一份儿 ​​​​​​​ 然后把它放到这个练习的文件夹下放到 code 里边 咱做一个备份防止效果出不来把文件还改岔劈了。 好了接下来的话我们打开这个 1-重命名.js 文件然后第一步我们先导入 fs 模块儿这个是固定的跑不了。 导入完毕之后下边第二步我们打算去读取code这个文件夹当中的文件列表我们就不挨个一位一位去做了直接读取好。const files  fsreaddirSync我们直接采用同步的 API 去做因为这样的话能省点劲儿。 然后写一个./code这里的话相对路径还是会存在那个bug不过我们这里为了方便待会儿就会在练习的文件夹下去运行这个 js 文件了。 好首先的话我们先看一看 files 它这个变量能不能获得文件列表然后我们在命令行里边运行一下子 node 1 杠table敲回车大家可以看一下我们是可以读取到这个文件夹当中的文件列表的不过读取出来之后这个结果跟在网盘里边的显示结果是一样的。 没事儿能读取到就行。读取到之后我们就要挨个儿去判断然后挨个儿去处理所以我们要遍历这个数组来个 files.foreach写一个回调函数我们先看看 item 能不能得到数组当中的每个元素。摁上敲回车。 好大家可以看一下是没有问题的那么没有问题怎么在这个一位数的数字前面补这个 0 呢我们要去做一个判断嘿嘿我们只要判断前面这个第一位它到底是不是小于 10 就可以了小于 10 就是一位数大于等于 10 就是两位数。 好那怎么来判断首先我们要先去对它做一个拆分这个文件名然后 let data 等于一个 item.split来一个中横线我们来看看 data 拆分之后的结果怎么样好然后摁上敲回车。好大家可以看一下我们就拿到了拆分之后的结果拿到之后我们接下来就可以去判断了。 为了方便我们声明两个变量写一个结构赋值第一个是null第二个的话咱们来个 name 等于一个data。好我们先来看看这个 null和 name 能不能获得数字和名字。好打印一下子 null 和name然后按上敲回车。大家可以看一下 num 是可以获得这个数字的而 name 是可以获得这个文件名的。 好接下来我们开始做判断。如果说 num 要是小于10表明它是一个一位数这个 num 它是个字符串我们可以使用 Number 进行强制类型转换把它变成一个数字。如果说它要是小于10说明它是一个一位数我们需要在它前边一个0所以 num 的话就应该等于0加上这个num。 OK那这个 num 我们的数字变完之后我们可以去创建新的文件名儿 let newname就等于num然后加上这个中横线再加上这个 name 就可以了。好我们来看看啊它的新名字长什么样子然后摁上敲回车大家可以看一下 1- 9 这些数字它们的名字就发生了变化前边多了一个0。 好那么新名字有了旧名字咱们也有旧名字是谁啊就是这个item我们就可以进行重命名了来重命名 f s.renameSync 括弧第一个参数是旧的路径./code然后再加上那个旧的名字。这里的话咱们用一下这个模板字符串儿这样的话拼接起来更方便一些。 dollar 括弧把那个名字旧名字拿过来旧名字是itemOK拿过来然后新名字咱写成./code/ $ 括弧把这个字符串儿变成模板字符串儿。好然后接下来咱们换上新名字 newName保存好代码咱们就已经完成了下边去看看效果怎么样。我们把 code 文件夹展开好见证奇迹的时刻就来了 node 1 杠 TABLE 敲回车。 好大家可以看一下这个文件名就改过来了点开咱们去看看这个内容有没有发生错位。点开追加的 appendFle 流失写入的 createwritestream然后重命名的rename然后查看资源的stat没有问题。好那么到这儿的话我们整个的效果就是已经达成了没有什么问题。 最后再留一个思考题大家下来之后自个可以尝试一下比如说我把 02 给你删了就010304我们的需求是你能不能把这个 03 变 0204 变03因此类推让他再按照这个正确的顺序去重命名。那么下来之后大家可以自个试一试我会把这个答案放在我们的资料文件夹当中。 032_path模块 ​​​​​​​ 来学习一下 nodeJS 当中的 path 模块儿这个模块儿主要是用来操作路径的这里列了几个API我们挨个儿给大家演示一下子为了方便待会儿用所以我可以先贴一个图。 好贴完图之后我们切过来。首先的话我们先来看第一个 path.resolve这个方法的话用来拼接规范的绝对路径。 在此之前我们演示过这样一个操作就使用 __dirname 加上一个路径来拼成一个绝对路径。当时说这种写法它其实并不是特别规范 那么下边的话我们再看看这个路径它的一个模样我们通过 log 来把这个路径打印一下子然后摁上敲回车。大家可以看一下这个结果这个结果它的路径分割幅是不统一的前边用的是反斜线后边用的是正斜线而借助于 resolve 我们就可以拼接出比较规范的绝对路径。 好那么下边我来给大家演示一下子resolve。首先用这个 resolve 之前我们要先把 path 这个模块儿要先导进来然后就可以通过 pass.resolve 去调这个方法了。 resolve 这个单词的本意其实是解决问题的意思而在这儿它接收几个路径的参数。 我们在用这个 resolve 的时候绝大多数情况第一个参数都会传这个 __dirname 就是传一个绝对路径然后这后边去传入相对路径比方说我们传一个点./index.html这个 resolve 就会和相对路径做一个计算最后拼接出最终的绝对路径。 我们可以拿使用 console.log 的方式来打印拼接后的结果然后按上敲回车。大家可以看一下这就是 resolve 拼接后的绝对路径它的每一个路径分割符都是反斜线是一个规范的绝对路径 ​​​​​​​ 然后这里我顺便说一下子我们在写后续的相对路径时可以不用去写点杠。我说过这个不写点杠它也是一个相对路径也可以跟前面这个绝对路径做一个拼接按上敲回车大家可以看一下这个结果跟上面这个结果是一样的。 当然有同学说我在写的时候我能不能直接去写一个斜线开头的路径就是第二个参数这块我能不能直接来一个斜线开头参数我说一下这样做是不对的如果你这样做的话第二个参数就不再是一个相对路径了它成了一个绝对路径了。 如果是绝对路径的话就会从这个路径第二个参数开始跟后边的相对路径第三、四……参数去做一个拼接我们可以看看它的一个返回结果是什么然后按上敲回车大家可以看一下直接是 d 盘下边的 index.html 如果后续我还有别的相对路径那么他就可以用这个路径第二个参数跟后边的相对路径去做一个拼接产出绝对路径。 所以我们在用这个 resolve 的时候第一个参数咱们给绝对路径后边参数都会给相对路径。 顺便说一下这个 resolve 我们用的稍微多一些而后边这几个API的话我们用的都比较少所以给大家演示一下大家了解就可以了。 我们下边来看看这个sep 的话它是 separator 单词的一个缩写意为分隔符 那么这个属性的话它是用来保存当前操作系统的路径分隔符 给大家演示一下 path.sep 保存然后 摁上交回车。大家可以看一下这里输出是一个反斜线 不同的操作系统它的路径分隔符是不一样的。在 Windows 下边路径分隔符是一个反斜线而在 Linux 系统下边它的路径分隔符是一个正斜线。 下边的话咱们再来看看第二个parse这个是一个方法用来解析路径获取路径的相关信息。比方说这里我们先获得一个路径为了方便给大家介绍一个新朋友就是__filename。这个杠杠 filename 有点像我们之前接触过的__dirname它也是一个全局变量当然了它也是加引号的因为它并不是一个真正意义上的全局变量但是它可以这样去理解它。 再看看 few name它所保存的是什么它所保存的是文件的绝对路径。注意它所保存的是文件的绝对路径。我们可以来看看这个变量它的一个结果按上敲回车那么此时你会发现我们就获得了这个文件的绝对路径。 OK有了绝对路径之后我们可以把这个绝对路径保存在一个变量当中复制粘贴这个时候发现颜色不对了为什么呢 因为这是一个转移字符要想正常的去输出反斜线我们还需要在前面对其做一个转移使其变为一个普通的反斜线。 好那么接下来的话我们就可以通过这个 parse 方法来对这个路径做一个解析了我们使用 console log 直接去输出然后将这个路径传进来看看结果按上坐回车。大家可以看一下这个方法的返回结果它是一个对象里边包含了一些信息其中 root 是所在的盘符 dir 是文件夹的路径部分这个 base 是文件名儿然后 ext 是文件的扩展名儿还有 name 是这个文件的文件名儿。 好这是关于 pass 方法它的一个返回结果然后下边是一些获取的快捷方式我们挨个儿来看一看。 首先的话是这个 basename它是用来获取文件名儿的。 好我们直接打印一下子然后 path.basename然后将这个路径传进来然后摁上敲回车大家可以看一下快速获取文件名。 那其次还有一个是 dirname这个是为了方便获取文件夹的路径部分也就是为了方便获取这一段内容。好我们来打印一下子path.dirname 括弧把这个路径复制过来然后摁上敲回车。好可以看一下路径部分就有了。 然后其次还有一个是这个 extname这个是方便获取文件的。扩展好我们来看看效果 log然后path.extname然后摁上敲回车OK文件扩展名获取到了。
http://www.pierceye.com/news/134283/

相关文章:

  • 网站建设与制作报价wordpress菜单怎么设置目录册
  • 学生免费建设网站建设网站是否等于开展网络营销
  • 旅游网站结构图网站编程图
  • 达内网站开发培训价格安装百度到手机桌面
  • 网站服务器慢建站设计网站
  • wordpress 多站点 插件怎么做网站主页设计
  • 网站建设初稿wordpress删除自豪的
  • 某网站突然不能浏览了网站不备案能用吗
  • 厦门做个网站多少钱360建筑网官网下载
  • 镇江外贸网站建设电子工程王粟
  • 申请网站建设经费wordpress做商城网站
  • google下载app西安分类信息seo公司
  • 淘宝是什么语言做的网站手机网站开发+手机模拟器
  • 视频网站开发框架小说类网站功能建设
  • 网站规划与设计案例网站建设方案设计
  • 漯河网站建设费用成都网站建设重庆最加科技
  • 莱芜 网站wordpress 关闭警告
  • 深圳做棋牌网站建设哪家技术好建设一个网站的规划
  • 网站开发流程比较合理网站已经申请了域名 接下来怎么
  • 校园电商平台网站建设网站网址模板
  • 沈阳有资质做网站的公司温州做网站定制
  • wordpress codex网站seo和sem是什么意思
  • 建网站平台哪家好装修设计软件app排行
  • 网站开发文档撰写企业管理培训课程图片
  • 网站开发公司资质wordpress文章管理模板
  • 建筑网站知识大全江苏有哪些网站建设的公司
  • 江汉网站建设用js做网站登录
  • wordpress做购物网站河南省建设工程造价协会网站
  • wex5可以做网站吗爱射影院网站建设中
  • 网站建设多选题百度文库做好中心网站建设工作总结