Node(1) Node介绍和fs文件系统模块

1.什么是nodejs

        nodejs是为了满足使用js实现后端开发的运行环境,js可以在浏览器中运行是因为浏览器有js解析引擎,而nodejs可以提供这个解析引擎和内置API,使js可以在后端运行。(在nodejs里js无法操作DOM和BOM)

2.fs文件系统模块

2.1 fs介绍

        fs是nodejs的内置模块,可以对文件系统进行操作。对文件的基本操作有:读取,写入,删除,重命名,拷贝等。

2.2文件读取方式

2.2.1同步读取readFileSync

同步读取有2个参数:file(文件地址),options(选项配置)

语法:fs.readFileSync(file[,options]),返回值为string|Buffer

2.2.2异步读取readFile

异步读取3个参数:file(文件地址),options(选项配置),callback(回调函数)

语法:fs.readFile(file[,option],callback),返回值undefind

                               

2.2.3读取流createReadStream

参数:file(文件地址),options(选项配置)

语法:fs.createReadStream(file[,options]),返回值object(读取流对象)

使用:

//创建读取流对象
let rs = fs.createReadStream('./观书有感.txt');
//每次取出 64k 数据后执行一次 data 回调
rs.on('data', data => {//流动模式
    console.log(data);
    console.log(data.length);
});
//读取完毕后, 执行 end 回调
rs.on('end', () => {
    console.log('读取完成')
})

常用options选项:flags:标识符,默认r;highWaterMark:3//每次读取3kb

使用rs.pause()会进入暂停模式,停止读取

rs.resume()恢复到流动模式

2.3文件写入

2.3.1同步写入writeFileSync

同步读取有2个参数:file(文件地址),data(数据),options(选项配置)

语法:fs.writeFileSync(file,data[,options]),返回值为string|Buffer

2.3.2异步写入writeFile

异步读取3个参数:file(文件地址),data(数据),options(选项配置),callback(回调函数)

语法:fs.writeFile(file,data[,option],callback),返回值undefind

2.3.3追加写入appendFile和appendFileSync

fs.appendFile(file,data[,option],callback),返回值undefind

fs.appendFileSync(file,data[,options]),返回值undefind

2.3.4写入流createWriteStream

参数:file(文件地址),options(选项配置)

语法:fs.createWriteStream(file[,options]),返回值object(读取流对象)

使用:

// 写入流

const we=fs.createWriteStream('./1.txt')

we.write('ok')

we.write('ss')

2.4文件移动和删除

nodejs中可以使用rename或renameSync对文件或文件夹进行移动和重命名操作:

fs.rename(oldpath,newpath,callback)

fs.rename(oldpath,newpath)

使用unlink或unlinkSync删除文件

fs.unlink(file,callback)

fs.unlinkSync(file)

2.5文件夹操作

mkdir和mkdirSync创建文件夹

fs.mkdir(path[,options],callback)

fsmkdir(path[,options])

注意创建时加选项{recursive: true},表示文件夹下的文件或文件夹一并创建

readdir和readdirSync读取文件

fs.readdir(path[,options],callback)

fs.readdirSync(path[,options])

rmdir和rmdirSync删除文件夹

fs.rmdir(path[, options], callback)
fs.rmdirSync(path[, options])

stat和statSync查看文件的详细信息

fs.stat(path[, options], callback)
fs.statSync(path[, options])

3.fs路径文件

模块在使用fs模块的时候,如果提供的操作路径是以./或../开头的相对路径时,很容易出现路径动态拼接错误的问题

原因:代码在运行的时候,会以执行node命令时所处的目录,动态拼接出被操作文件的完整路径

解决方案:__dirname表示当前文件所处的目录

Fs.readFile(__dirname+’路径’,function(){});

重复写入同一个文件的时候会覆盖原来的内容

path路径模块用来处理路径的模块,它提供了一系列的方法和属性,用来满足对路径的处理需求

const path=require(‘path’)

path.resolve()总是返回一个以相对于当前的工作目录(working directory)的绝对路径

path.join()方法,将多个路径片段拼接成一个完整的路径字符串

path.join([…paths])返回值是一个拼接好的字符串

path.basename()方法,用来从路径字符串中,将文件名解析出来

获取路径中的最后一个部分,经常通过这个方法获取文件名

path.extname()获取文件扩展名,返回值是一个字符串

4.Buffer缓冲器

缓冲器的本质是一个内存空间,他被创建后大小无法改变,他的内存是通过c++申请的,并不是js。其中,数据以二进制的形式存储,但是会以十六进制进行展示。

创建方式

1.Buffer.alloc

语法:Buffer.alloc(8)//创建一个8字节的内存空间,其中每一个字节值为0

2.Buffer.allocUnsafe

语法:Buffer.allocUnsafe(8)//创建一个8字节的内存空间,其中每个字节的值未知,因为它在分配空间前不会去情况数据。这样做性能会高,但是有数据泄露的风险

3.Buffer.from

语法:Buffer.from([1,2,3])//创建一个3字节的内存空间,其中值为1,2,3

Buffer字符串的转换:

const buf4 = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117])

console.log(buf4.toString());

使用buffer进行分片读写:当文件太大的时候无法使用readFile进行一次性的读取或者writeFile一次性写入,这个时候可以利用buffer进行边读边写:

const fs=require('fs');

const path=require('path')

const but=Buffer.alloc(4)

fs.open(path.join(__dirname,'./1.txt'),'r',(err,ra)=>{console.log(ra);

//在使用fs.read和fs.write的时候第一个参数为fd,是fs.open()方法返回的文件描述符

  fs.open(path.join(__dirname,'./2.txt'),'w',(err,wa)=>{console.log(wa);

    fs.read(ra,but,0,4,0,(err,da)=>{console.log(da);//da和as是读取或写入了几个元素

      fs.write(wa,but,0,4,0,(err,as)=>{console.log(as);

        console.log(111);

      })

    })

  })

})

这只是其中读取一次的操作,还需要搭配递归,写来很复杂,而且有回调地狱的倾向不利于维护

所以需要使用流

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

morningstay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值