createReadStream

createReadStream方法创建一个将文件内容读取为流数据的ReadStream对象。具体语法:fs.createReadStream(path[, options])

  1. path表示路径
  2. options是一个对象,表示可选对象。
    • flags :文件系统 flag 的支持。默认值: ‘r’。
    • encoding : 编码方式 默认值: null。
    • autoClose : 文件描述符会是否能被自动地关闭
    • start end : 读取文件的长度
    • mode : 设置文件模式
    • highWaterMark : 可以读取的大小

在使用过程中,我们无法用普通方法获取读取到的数据,必须使用on()去监听事件。

  1. 通过on('open',()=>{})监听文件是否被打开
  2. 通过on('close',()=>{})监听文件是否被已经关闭
  3. 通过on('error',()=>{})监听文件读取是否被出错
  4. 通过on('end',()=>{})监听文件读取是否完成
  5. 通过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是一个对象,具体属性有:

  1. flags:文件系统 flag 的支持。默认值: ‘r’。
  2. encoding:编码方式 默认值: null。
  3. autoClose:是否能被自动地关闭
  4. mode:文件模式
  5. start:开始写入的位置
  6. highWaterMark:一次最大写入的字节数

在 createWriteStream 中我们会用到open ,write,end,close,drain等方。我们现在具体讲解一下使用过程

  1. 当 createWriteStream 被创建时自动执行open() 方法
  2. 通过 write() 方法写入数据。当某次写入时总共写入的字节数超过 highWaterMark 中设置的值时,会导致流堵塞,这个使用会调用
  3. 当调用 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

在使用createReadStreamcreateWriteStream对读写文件的过程中,可以通过pauseresume暂停或恢复文件的读取操作。

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)

  1. path是文件或目录的路径
  2. 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)

  1. path是文件或目录的路径
  2. options是一个对象,包含两个参数:encodingwithFileTypesencoding指定用于传给回调的文件名的字符编码,如果encoding 被设置为 'buffer',则返回的文件名会作为 Buffer 对象传入。withFileTypes设置为 true,则 files 数组会包含 fs.Dirent 对象。
  3. callback是回调函数,有两个参数(err, files),其中 files 是目录中文件的名称的数组(不包括 ‘.’ 和 ‘…’)
fs.readdir('./文件夹名', (err, files) => {
    console.log(files);
})

同理也可以通过同步的方式读取,具体语法格式:fs.readdirSync(path[, options])

新建目录

在fs模块中,我们可以通过readdir()异步的方式读取目录中的子文件和目录。具体的语法格式:fs.mkdir(path[, options], callback)

  1. path是文件或目录的路径
  2. options是一个对象,包含两个参数:moderecursivemode指定用于设置权限和粘滞位。recursive表示是否要创建父目录
  3. 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是一个对象,含有三次参数,都用于定义当没有删除成功后是否进行循环删除。

  1. recursive是否执行递归的目录删除。如果为 true,则执行递归的目录删除。默认是fals
  2. retryDelay重试之间等待的时间(以毫秒为单位)
  3. maxRetries此选项表示重试的次数。默认值: 0。

flag

在学习fs模块的时候,我们经常看到flag属性。flag 就是以什么形式打开文件进行什么操作。看具体的参数

  1. a:打开文件用于追加。如果文件不存在,则创建该文件。

  2. ax :类似于a,但如果路径存在,则失败。

  3. a+:打开文件用于读取和追加。 如果文件不存在,则创建该文件。

  4. ax+:类似于a+,但如果路径存在,则失败。

  5. as:打开文件用于追加(在同步模式中)。 如果文件不存在,则创建该文件。

  6. as+:打开文件用于读取和追加(在同步模式中)。 如果文件不存在,则创建该文件。

  7. r:打开文件用于读取。 如果文件不存在,则会发生异常。

  8. r+:打开文件用于读取和写入。 如果文件不存在,则会发生异常。

  9. rs+:打开文件用于读取和写入(在同步模式中)。 指示操作系统绕过本地的文件系统缓存。

  10. w:打开文件用于写入。 如果文件不存在则创建文件,如果文件存在则截断文件。

  11. wx:类似于 w,但如果路径存在,则失败。

  12. w+:打开文件用于读取和写入。 如果文件不存在则创建文件,如果文件存在则截断文件。

  13. wx+:类似于 w+,但如果路径存在,则失败。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐