00:00
大家好,这节块我们来看一下node JS啊,提供的这些基本模块中的第一个模块FS模块,那FS呢是非system的一个缩写,就是呃,提供了本地文件的读写能力啊,这个模块呢,基本上是对这个process文件操作命令的一个简单的包装啊,但是这个模块提供了两个版本啊,一个异步版和一个同步版来让我们开发者自己选择啊,那首先来看看读取文件啊,这个方法用来读取就是异步读取数据,那带这个think的就是同步读取,我们先来看第一个啊,那个在上一节课我们也用了这么一个例子啊,嗯,来写一下我们的这个减一个零四。好,接下来创建一个index.gs那在这里面呢,呃,我就直接。拿上节课我们这个例子了啊,把这两个文件给复制过来,这个就不要了。
01:05
把这两个给复制过来。来看一下这个index啊,我们把这个其他的没用的给删掉啊。好,那在上节课我们也使用了啊这个模块,看一下这个模块它有这么几个参数啊,那第一个参数就是文件的这个路径啊,可以是绝对路径,那在上一节课我们用这个例子就是使用的绝对路径是当前文件所在的一个啊目录的名字连上这个文件的名字就是绝对路径啊,再然后也可以是相对路径,但是需要注意的是,如果是相对路径,它是相对于当前进程所在的路径,也就是啊,Process c WD这个路径,而不是当前脚本所在的路径,这句话怎么怎么理解呢?来,我们先来运行一下这个文件啊啊。首先是这个NODE04下面的index,哎,可以看到读出来这个内容呢,是一个buffer,对吧?啊,那我们使用绝对路径没有问题,那接下来我们来使用相对路径,相对路径我们可以使用点杠,或者说哎什么都不写,那我们写择点杠,那我们在使用这个点杠,为什么读取不到这个文件呢?它报错呢,那是因为如果我们使用相对路径,它这个相对路径啊,它不是相对于我们当前这个写代码的这个文件的这个路径啊,它不是相对于这个index GS,它是相对于谁,相对于进程所在的啊,所执行的这个命令,来注意这句话啊,如果使用是相对路径,是相对于当前进程所在的路径,也就是pro six c WB啊这个路径,那我们来打印一下,看看它到底是什么呢?好好,那我们就在最上面打印吧,啊在这打印吧。
02:49
第2LOG啊,接着再来执行,好,下面报错就报错,我们来找一找,可以看到我们进程所在的目径是我们的项目所在的目录,大家发现没有,那实际上这个进程所在的这个目录是什么呢?就是我们执行这个node命令所在的这个目录,大家看一下我是在哪个目录下执行这个node命令了,哎,PD我是不是在这个目录去执行的这个node命令,对吧?啊,只不过我们执行这个node命令,我们还加了一个目录,是零四目录下面的in减GS,所以说这个相对路径,它是相对于谁,相对于这个进程所在的这个。
03:24
就这。清楚了吗?啊啊,所以就呃,使用相对路径的话,那因为我们的进程所所在的是这个目录,哎,而我们的实际的文件的路径呢,还带了一个零色,哎,所以呢,我们这时候三路路径就会出现读不得的这个一个问题。对吧,好。来,那呃,我们改一下怎么改呢?啊也可以这么去改,那既然相对路径是相对于这个啊,这个路径啊是进程所在路径,那么我读谁读这个当前目录下这个零四下面的负载text,这时候再来看一下是不是就读到了对不对?哎,咱这么的写的话大家比较绕啊啊呃,通过这个例子呢,只给大家说一下,如果你这个路径是相对路径,你要特别小心,它不是相对于你这个当前这个文件所在的这个路径,而是相对于这个进程啊我们执行这个node命令所在的这个路径清楚了吧?啊啊接着呢啊,在读取完成之后会触发,哎,我们第二个参数,这个回调函数啊,第回调函数的第一个参数就是发生错误的时候错对象,第二个呢,就是读到的这个内容啊,内容是这个buff啊,那这二个内容为什么是buffer呢?因为我们没有指定读取到,就是说读取的这个格式,哎,那比如说我们使用这个同步的方式,指定这个读取的这个文件的。
04:45
这个编码就可以诶,得到这个文本的一个内容,那当然我们得到这个buffer这个实例,那buffer呢,它提供了一些方法,也可以去诶进行转换,把这个啊buff法转成这个字符串,比如还按我们刚才这个例子啊。
05:00
进程所在的。目录啊,进程执行进程的目录,把知识给大家补上啊,执行进程的目录,哎,是这个啊啊如果使用相对路径。路径啊,不是相对于当前文件啊,而是相对于这个node啊,进程的这个node啊,执行进程的目录,执行的目录,哎,这个大家要注意啊,好,那我们知道这里呢,我们得到是一个buffer buffer它提供的一些方法可以让我们哎进行哎对buffer的一个转换,比如它有一个这个啊to string方法,就可以把这buff法转成这个字符串,那这时候呢,我们就得到了,诶这个哈,这个我们文本里面的这个内容对不对,这是一种方式啊。
06:07
那还有什么方式呢?啊,把这个方法给大家写上啊,使用这个B法的方法转换成啊字符串,好还有一种方式是诶异步读取呢,它实际上还有一个诶中间一个参数可以指定文件的一个编码,如果我们指定了utf杠八,诶指定了要读取的这个文件格式,那么这个就不再是这个打法啊,我们来输出一下啊,Log一下这个贝看一下啊,可以看到是不是直接得到了这个结果,清楚了吧?啊好,那么把这个注释写一下,嗯,如果第二个参数不是啊文件编码。
07:00
那么毁掉。函数第二个参数是这个buff。嗯,太长了,把它给剪切一下,剪切到这里啊好,那这里呢,就刚好相反,就说如果这个第二个参数是这个文件编码,那我们回到函数的第二个参数,就是哎,指定编码后的这个数据啊。编码后的数据,哎,那我们指定是UTF8,所以哎可以直接当做字符串给显示好,这是一点啊,接着再来看我们的笔记,那我们在使用的这个呢是呃,异步读取的一个版本,当然它还提供了一个同步读取的一个版本,返回的,呃返回的内容呢,实际上也是取决于我们指定的这个编码,清楚了吧,来我们一般会把这个同步的给它指定一个编码,来看一下它这个介绍啊,同步读取文件第一个参数是文件路径啊,第二个参数啊,可以表示啊,配置一个对象,也可以是一个文本的一个文件编码格式啊啊。
08:16
来我们看一看,如果不指定这个编码,它也会返回一个buff法啊,否则就返回字符串,其实和同步的都是一样的,只不过我们指定,呃,就是说异步相当于同步的版本是多了一个第三个参数,多了一个回调函数,哎,当然如果我们省略掉这个指定编码的话,那异步的就是哎,两个参数一个路径一个回调函数啊,这个区别大家注意一下啊啊,这个例子我们来看一看同步的一个版本啊嗯,同步的这个版本我们来读取还是读取这个吧。好。再然后使用这个啊,Text我们来输出一下啊,点log,嗯,加这个同步读是好,我们来执行一下这个文件可以看到啊,很明显的这个同步的是先输出的啊,然后之后这个异步的它才执行啊,那这是关于文件的这个读取啊。
09:21
接着再来看一下啊,看一下这个写入文件啊,使用这个right view方法来写入这个文件,也是同时提供了啊,异步版本和同步版本啊,啊这个方法呢,也是这么几个参数,第一个参数你要写入这个文件,同样的也是支持这个绝对路径和相对路径啊,和上面的路径都是一样的相对路径你要特别注意,然后第二个参数是写入的这个内容,第三个是一个回调函数,哎,就是写入成功的话,它会就是说就没有这个异常,如果写入失败就会有这个错误异常啊。啊呃,当然呢,还可以在这个回调函数前面啊,在回调函数前面再多加一个参数啊,绊示这个写作的这个编码啊,默认就是UTF8不加也可以清楚了吧?哎,注意这有一点需要注意的是,不管是读取文件还是写入文件,我们能省略的这个文件编码,它不是最后一个参数,它是倒数,第二个是回答函数前面这个参数,因为node的约定,之前给大家讲node介绍node的时候是不是讲过node约定,哎,回调函数是作为最后一个参数,清楚了吧?啊啊呃,这个write file啊,Think它是用于同步写入文件啊,同步写入文件呢,实际上就相比异步就省略了一个回调函数对吧?啊,其他的这个参数都是一样的啊,我们来写一下啊这个例子。
10:45
嗯,把这个我们给它注释一下啊,Read fail啊read fail读取文件我只写了一个异步的啊,同步的我就不写了读取文件。
11:02
那接下来的内容是,嗯,我重新来一下吧,再建一个文件吧,那把这个文件给它重命名一下。啊,那这个就叫read吧。好,那再来一个GS的文件。那我们叫这个right.js啊,在这里面来写我们的right啊,首先你需要诶导入这个文件模块require FS,接着如果我们要写入一个文件的话,就是使用这个FS的这个啊,Right。方法啊,Right feel,它有两个方法,一个是这个E的写入,一个是同步的这个啊写入啊,这里呢,给大家也都列出来了,那我们先来看一看这个异步的啊red fail,第一个参数是我们要写到哪个文件里面,也是支持绝对路径和相对路径,那这里我们使用这个哎,相对路径,呃,注意啊,相对的还是进程所在的这个路径啊,因为我们是在node,在这里面去执行进程,所以呢,我们如果使用这个路径要加上这个零四啊好,如果这个呃相对路径大家不太好理解,那我们来使用绝对路径,绝对路径我们怎么来写呢?先获取当前这个文件所在的这个目录啊,是不是Di name对吧,我们再连上啊这个。
12:28
啊,要写这个文件,好吧,我们来写一个啊,点这是第一个,第二个就是要写的这个内容,呃,Right hello啊第三个参数,诶指定我们写的这个编码,如果不指定,默认就是UTF8,那最后一个就是一个回调函数,它只有一个参数,就是一个error若啊,如果有error若我们就啊输出哎暴露这个艾若,如果没有艾若就是写入成功对吧?啊我们来写一个这个啊写中文版写入成功,好接下来我们来执行一下这个文件,是这个right啊NODE04下面的这个right GS可以看到显示成功,那这里面就会多页文件,它为什么没有显示呢?因为这个编辑器它有一个延迟,就是我们来手动的去哎折叠再打开一下啊就。
13:28
会看到这个文件对吧,里面的内容是不是我们写入的这个内容,好这课文件就写入成功了啊,那同步版本呢,也给大家写一下啊,Right非think啊嗯,这我就直接复制吧,它就相比于这个异步版本呢,少了一个这个回调函数,少了一个最后一个参数回调函数啊right hello2来再来执行一下,可以看一下这里面的这个内容是不是HELLO2啊,注意它这个写入是一个覆盖的一个过程,不是追加的过程,你看我们这里写入了这个hello,最后会被下面的这个,呃,这个最终这个写入给给覆盖掉啊。
14:10
接着来看我们的笔记啊。还有一个方法啊,CE,它用来判断给定的路径是否存在啊,不管结果如何都会回调啊,都会调用这个函数啊。来上面的这个代码表明回调函数参数啊,它是一个表示文件是否存在的一个布尔值,就是这个,我们检查这个文件存在就好,出不存在就返回这个false啊好,但是有一点需要注意,我们不要在这个open之前去调用这个方法啊,因为open本身就会检查文件的这个啊存在啊,这个open是指什么?就比如说我们哎读取啊,就是说啊,或者打开一个目录的时候,不用去特定的调调用它去检查,因为本来我们这个读取或者写入啊,它就会执行,就检查这个文件存不存在啊好,那个我们来看一下啊。
15:08
来写一下。我们再来建一个文件other啊,那其他的例子呢,我们就放到这里面,一个独的一写的,我们给它独立出来,好我们来检查谁呢?嗯,就随便检查这个这个路径嘛,那这个路径呢,肯定是不存在的,对吧?好,那要使用这个FS模块,我们。先引入啊这个FS模块啊好,那这里呢,我们就用cons look来输出吧,来接下来执行一下这个A好可以看到no feel是找不到它的啊,那如果我们把这个路径啊给它写对,比如说啊零四下面的这个我们就用相对路径了啊零四下面的谁呢?啊负这text这时候诶就可以看到是找到能找到这个文件啊。
16:13
来写一下啊嗯,把故识给大家写一写,判断通过目录是否存在啊,是否存在啊啊判断目录也是可以的,比如说我这里写这个零四可以看到啊,零四也是能找到的啊,但是你要找这个零五这个目录它就会没有了啊,所以说是文件或者目录啊,是否存在,那这是这个方法啊,来快速过一下其他的方法,那这呢是一个,呃,还有一个方法是make点是创建一个目录啊,它的这个参数就比较简单,第一个是你要创建哪个目录,第二个是你创建的这个目录的前限啊,077啊就是unix,或者说是这个Linux,就是类unix系统里面的一个权限的格式啊,零表示十进制,这个表示所属用户的权限啊,所属这个组的权限,第三位表示这个所属这个其他的这个权限啊。
17:13
啊,第三个就是一个回调函数啊好嗯,那后面这两个啊,一个写入一个一个读取,这个前面大家说过了啊,给大家说过,这是一个组合的一个案例,这个案例呢,我就不演示了,大家自己去练习一下啊。嗯,接下来是异步的啊,就是说同步的创建这个目录,以及同步的写入,同步的读取,这也是一个组合的例子啊,大家自己看一看就可以啊,但是对于这个流量比较大的服务器呢,推荐采用异步操作,因为同步操作的话,呃,必须得等前一个操作结束,下面才会执行,就会造成这个阻塞啊。嗯,接下来是读取这个目录啊,Read啊D,以及这个同步读取read Di think,它会返回包含这个文件和这个子目录的一个数组。
18:01
我们来看一下啊这个啊,Read点找到我们的代码来新建一个文件,Read点我们把这个例子给拿过来啊好,这里用到了这个FS啊,我们再把它给导入过来FS,好呃,给大家讲一下这个代码啊,这里呢去使用这个方法去读取啊,当前就是node进程下的啊,这个所有这个目录啊,这里呢是填这个目录,就是说你要读取哪个目录下的它的这个子目录和文件,那使用这个process的呀,是WD,就是进程所在的,就执行这个进程所在这个目录,那我们是在这里面去执行的这个,哎,就是在这个node GS这个目录下去执行的这个noe,按理说它应该读取到这里面的这些目录,对吧?啊接下来它两个参数,一个是error,就是出错的情况下,一个是这个FS读到了这个文件,那读到这个文件了之后呢,获取这个文件。
19:01
面的长度,然后定一个变量来便利这个文件,然后把这个呃,每一个文件的一个内容,然后给到了这个数组里面啊,最后再进行一个处理啊,那这里呢,后面我们就不要了啊,我们就简单的输出一下这个读取到的这个文件的这个数量log.count啊,或者说我们诶直接打印一下读取到的这个文件好吧。啊,那接下来NODE04下面的READ02,好,再强调一遍啊,我们这个目录它相当于谁,相当于我们执行这个note所在的目录,就是这个目录啊,Notes目录啊,我们来看一看这个执行的这个结果,可以看到啊,读行读出了这个01020304,对吧,这个是编辑器的缓存目录啊呃。就是编辑器它的一个缓存的目录,那正常的来讲,我们如果不不算这个缓存目录的话,是不是就读到了01020304这几个目录是不是啊,然后我们就可以哎循环,就是说对它做一个判断,如果是文件就继续,呃,就读出内容,如果是目录就继续去向下读,就可以递归去读啊,一层一层的去读这个内容,那现在呢,我们还没有学这个类型判断这个函数啊,先简单的知道这个read这个方法就知道了,好,那接下来我们继续看这个文档啊,下面的这个例子呢。
20:25
是同步读的一个例子,就不给大家演示了啊。呃,这个里面用到了这个状态判断,诶,可以看到是使用的这个space啊,然后他判断了这个是不是目录啊,你看space.is decy,如果是目录的话啊,就继续输出这个文件名啊啊,那接下来就到了这个方法啊好,这个方法呢。它的参数是一个文件,是一个目录,产生一个对象,那这个对象包含了这个文件或者目录的具体信息,然后通过这个方法判断处理的这个,呃,传入的这个参数啊,是一个文件还是一个目录啊,就是通过它来判断,好我们来写一下啊,就用这个例子吧,用同步读取的这个例子,那上面这个我们就先注释掉啊,这个是异步的来同步读取的这个例子。
21:21
首先使用FS的这个同步读取啊,读取这个所有的这个文件,然后对文件进行便利,对吧,然后这个文件的名字呢,呃,我们使用的是这个。呃,Pass,然后第二连上它就是文件的这个。完整的这个这个路径啊,这个pass呢,我们没学,我们到下面会讲这个pass这个模块啊。啊,简单的先介绍一下啊,第一个参数是接收一个目录,第二个接收一个文件名啊,它会,呃,把这个目录和文件名进行一个连接,形成一个绝对路径,好,那这个目录哪来的呢?是我们在前面定义的啊,就是要读取哪个目录啊,我先把这个点给定义出来,那为什么提前定义出来,因为这里在读取文件时候也用到了,对吧?那后面再连接的时候也用到了啊等会我们再说目录的事情啊,这里先继续介绍,然后就使用到了这个啊state啊state state这里我们使用的是同步的一个方式啊,同步的一个方式大家可以看到我们这个笔记啊,这个state是怎么使用的啊,那这个state呢,是一个异步的一个方式,好,那我们使用的是谁呢?使用的是。
22:29
同步的啊,这样一个方式啊,同步的一个方式,它会得到一个呃,我们传入的这个呃,目录或者文件,它的一个具体的一个数据啊,具体的一个信息,一个对象信息,然后我们可以通过这个判断它是不是目录啊,如果是目录,我们给它连接一下这个目录的名字啊,否则的话呢,就是说呃,继续输出这个文件的一个啊大小,以及它的这个类型啊。呃,那接下来呢,我们来看一看,那我们读取哪个目录呢?就读取这个per啊,诶,当前进程所在的目录啊,我们执行的这个进程所在的这个目录啊,下面来看一下啊read.gs啊。
23:16
好报错了啊,这里没有定义啊,我们要使用它的话呢,还要把它给引入一下才可以。啊,这个模块我们到后面也会,诶给大家做一个讲解啊pass,诶这时候再来看可以看到啊啊这个是缓存目录,那第一个目录,然后啊有一个它的这个具体的一个信息啊,这是目录名,这是它的这个大小,你看这里我们输出的这个点size嘛,然后这里是它的这个啊啊最后修改的一个就是修改的一个时间啊mtime好,这是关于这个state啊state呢,这里给大家打印一下,看一下它的一个情况啊。
24:01
哎,这个就是里面包含的这些数据啊。嗯,有它的这个大小啊,有这个创建的时间呢,啊有这个。呃,其他的一个就时间的时间呢,还有两种,一个时间戳一个这种就是格式化好后的一个时间啊。还有这个什么UID等等啊,文件的一个信息,当然这个state呢,它也提供了一些方法啊,也提供了一些方法,让我们来就是进行文件啊,或者目录的一个判断,好,那是这个state啊,下面呢这个例子,哎,我们就不演示了,大家自己看看,也是读取这个ETC下面的这个啊,读取这个ETC目录,哎,然后呃,循环这里面的文件,然后也是判断这个is费啊is呢是判断是否是文件,这里我们用的是is啊,Toy是判断是否是目录啊,如果是文件,哎,我们就输出它是文件,否则的话判断它是不是目录,然后就输出这个目录,看到了吧?啊好,这个大家自己试一下这个例子,接下来还有两个方法是这个。
25:07
啊,Watch file就监听一个文件,如果文件发生改变,就会自动触发啊这个,然后还有一个是按watch费是解除这个监听,那这个监听呢,这个文件呢,呃,我们来这个方法我们来写一下试一下啊。嗯,来新建一个文件。我起飞,好,先提前把这个FS给引入,IQIFS,接着来写我们的这个例子啊,这里引入了,其实使用它来监听,好,我们来写一下啊。给大家来看一下哎,这个代码啊,首先呢,是开启了这个文件的这个监听,监听这个文件,诶当然我们没有这个文件对吧,那我们呃,把它改成当前目录零四下面的啊,这个负点T啊啊,它说到这个回调函数里面说的两个参数,一个是啊当前的一个时间,一个是上一次的一个时间啊接下来我们又写了一个。
26:06
呃,就是说异步写入,就说写入的一个函这个方法啊,像哪个文件呢,也是向这个文件去写入这个内容啊,写入谁呢?写入这个内容记记得啊,如果没有错误,哎,这里面就会输出文件写入成功,那写入成功的时候他应该会执行。清楚了吧,啊,他应该会执行,就我们监听的这个文件的一个改变嘛,好,我们来验证一下啊,执行这个node node04下面的watch GS,可以看到文件写入成功之后,我们监听的这个内容它就会输出啊是不是好那我们为了再做一次测试,现在我们来手动去改一下它的内容,比如说我来呃回车随便写个AAA,然后保存,大家可以等一下啊看可以看到我们监听的这个文件的改动,它又执行了。
27:00
对吧,啊,那这个就是啊,监听文件的这个改动啊,忘记了啊,就是这个方法啊,监听一个文件,如果文件发生变化就会出掉触发,那下面一个方法是对应的,解除这个。下面这两个方法啊,大家了解一下就可以了,就是往往适用于这个比较大型的一个文件啊,我们再去这个就是这是创建了一个这个读取操作的一个数据流,就是把比较大的文件我们分分批次啊,分这个流啊,分几次去发送,每次都会触发一个对的事件,然后等这个文件全部啊去读取完成,操作完成的时候就会触发一个N的时间,那对应的读就会对应的写,哎,以这个流的方式创建一个写入流的一个对象啊,直到写入完成,N的方法就会啊结束这个写示操作,好,那这个就是noe啊,这个提供的内置的一个FS模块,我们在操作这个文件和目录的时候,一般都会用到这个啊模块,然后简单的给大家写了一些小例子,啊好,那这节课呢,我们就先到这里。
我来说两句