Node.js中的fs模块(三)
createReadStreamcreateReadStream方法创建一个将文件内容读取为流数据的ReadStream对象。具体语法:fs.createReadStream(path[, options])。path表示路径options是一个对象,表示可选对象。flags :文件系统 flag 的支持 默认值: ‘r’。encoding : 编码方式 默认值: null。autoClose :
createReadStream
createReadStream
方法创建一个将文件内容读取为流数据的ReadStream对象。具体语法:fs.createReadStream(path[, options])
。
path
表示路径options
是一个对象,表示可选对象。- flags :文件系统 flag 的支持。默认值: ‘r’。
- encoding : 编码方式 默认值: null。
- autoClose : 文件描述符会是否能被自动地关闭
- start end : 读取文件的长度
- mode : 设置文件模式
- highWaterMark : 可以读取的大小
在使用过程中,我们无法用普通方法获取读取到的数据,必须使用on()
去监听事件。
- 通过
on('open',()=>{})
监听文件是否被打开 - 通过
on('close',()=>{})
监听文件是否被已经关闭 - 通过
on('error',()=>{})
监听文件读取是否被出错 - 通过
on('end',()=>{})
监听文件读取是否完成 - 通过
on('data',()=>{})
监听文件读取到的数据,这个监听事件就是获取得到的数据
let rs = fs.createReadStream('input.txt', {
encoding: 'utf-8',
highWaterMark: 3
});
rs.on('data', chunk => {
console.log(chunk);
})
rs.on('open',fd=>{
console.log('开始读取文件');
});
rs.on('end',()=>{
console.log('文件已全部读取完毕');
});
rs.on('close',()=>{
console.log('文件被关闭');
});
rs.on('error',(err)=>{
console.log('读取文件失败');
});
createWriteStream
createWriteStream
方法创建一个将流数据写入文件中的WriteStream对象。具体语法:fs.createWriteStream(path[, options])
。options是一个对象,具体属性有:
- flags:文件系统 flag 的支持。默认值: ‘r’。
- encoding:编码方式 默认值: null。
- autoClose:是否能被自动地关闭
- mode:文件模式
- start:开始写入的位置
- highWaterMark:一次最大写入的字节数
在 createWriteStream 中我们会用到open ,write,end,close,drain等方。我们现在具体讲解一下使用过程
- 当 createWriteStream 被创建时自动执行open() 方法
- 通过 write() 方法写入数据。当某次写入时总共写入的字节数超过 highWaterMark 中设置的值时,会导致流堵塞,这个使用会调用
- 当调用 end() 方法时自动执行 close() 方法
var out = fs.createWriteStream('./input2.txt', {
encoding: 'utf-8',
highWaterMark: 3
});
out.write("我想写入");
out.on('open', (fd) => {
console.log('需要被写入的文件已打开');
});
out.on('drain', () => {
console.log("管道被堵住了");
out.end('再见', function() {
console.log('文件全部写入完毕');
console.log('共写入' + out.bytesWritten + '数据');
});
});
out.on('close', () => {
console.log('需要被写入的文件关闭');
});
pause和resume
在使用createReadStream
和createWriteStream
对读写文件的过程中,可以通过pause
和resume
暂停或恢复文件的读取操作。
let rs = fs.createReadStream('input.txt', {
encoding: 'utf-8',
highWaterMark: 3
});
rs.on('data', chunk => {
console.log(chunk);
rs.pause();
})
rs.on('pause', chunk => {
setTimeout(() => {
rs.resume();
}, 3000)
})
fs模块中其他文件或目录操作
在之前几篇内容中,我们主要讲述了对文件进行读写操作。那么现在我们去了解一下对文件或目录进行其他操作,例如获取文件或目录信息,新建目录等
获取文件或目录的信息
在fs模块中,我们可以通过stat()
异步的方式获取文件信息。具体的语法格式:fs.stat(path, callback)
path
是文件或目录的路径callback
是回调函数,有两个参数(err, stats), 其中 stats 是 fs.Stats 对象。
fs.stat('./input.txt', (err, stats) => {
console.log(stats);
})
回调函数中的第二个参数stats
中具体的属性,如下:
那么也可以通过同步的方式获取文件信息,具体语法格式:fs.statSync(path)
读取目录中的子文件和目录
在fs模块中,我们可以通过readdir()
异步的方式读取目录中的子文件和目录。具体的语法格式:fs.readdir(path[, options], callback)
path
是文件或目录的路径options
是一个对象,包含两个参数:encoding
和withFileTypes
。encoding
指定用于传给回调的文件名的字符编码,如果encoding
被设置为'buffer'
,则返回的文件名会作为 Buffer 对象传入。withFileTypes
设置为 true,则 files 数组会包含 fs.Dirent 对象。callback
是回调函数,有两个参数(err, files),其中 files 是目录中文件的名称的数组(不包括 ‘.’ 和 ‘…’)
fs.readdir('./文件夹名', (err, files) => {
console.log(files);
})
同理也可以通过同步的方式读取,具体语法格式:fs.readdirSync(path[, options])
新建目录
在fs模块中,我们可以通过readdir()
异步的方式读取目录中的子文件和目录。具体的语法格式:fs.mkdir(path[, options], callback)
path
是文件或目录的路径options
是一个对象,包含两个参数:mode
和recursive
。mode
指定用于设置权限和粘滞位。recursive
表示是否要创建父目录callback
是回调函数,有两个参数(err, [path]),其中 path是创建的第一个目录的路径( 如果 recursive 为 true)
fs.mkdir('路径', { recursive: true }, (err, path) => {
console.log(path);
})
同理也可以通过同步的新建方法,具体语法格式:fs.mkdirSync(path[, options])
删除文件或目录
删除文件
fs.unlink(path, callback)
fs.unlinkSync(path)
删除目录
fs.rmdir(path[, options], callback)
fs.rmdirSync(path[, options])
options
是一个对象,含有三次参数,都用于定义当没有删除成功后是否进行循环删除。
recursive
是否执行递归的目录删除。如果为 true,则执行递归的目录删除。默认是falsretryDelay
重试之间等待的时间(以毫秒为单位)maxRetries
此选项表示重试的次数。默认值: 0。
flag
在学习fs模块的时候,我们经常看到flag属性。flag 就是以什么形式打开文件进行什么操作。看具体的参数
-
a
:打开文件用于追加。如果文件不存在,则创建该文件。 -
ax
:类似于a
,但如果路径存在,则失败。 -
a+
:打开文件用于读取和追加。 如果文件不存在,则创建该文件。 -
ax+
:类似于a+
,但如果路径存在,则失败。 -
as
:打开文件用于追加(在同步模式中)。 如果文件不存在,则创建该文件。 -
as+
:打开文件用于读取和追加(在同步模式中)。 如果文件不存在,则创建该文件。 -
r
:打开文件用于读取。 如果文件不存在,则会发生异常。 -
r+
:打开文件用于读取和写入。 如果文件不存在,则会发生异常。 -
rs+
:打开文件用于读取和写入(在同步模式中)。 指示操作系统绕过本地的文件系统缓存。 -
w
:打开文件用于写入。 如果文件不存在则创建文件,如果文件存在则截断文件。 -
wx
:类似于w
,但如果路径存在,则失败。 -
w+
:打开文件用于读取和写入。 如果文件不存在则创建文件,如果文件存在则截断文件。 -
wx+
:类似于w+
,但如果路径存在,则失败。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)