fs模块

21 阅读6分钟

有这么一个需求:往test.txt文件中写入test23

首先我们需要引入fs模块

const fs = require('fs');

异步写入

然后调用writeFile方法:

fs.writeFile 函数用于将数据异步写入文件。如果文件不存在,此函数将创建一个新文件。如果文件已经存在,它将覆盖文件的内容。 以下是该函数的参数列表:

file:要写入的文件路径。

data:要写入文件的数据,可以是字符串或 Buffer

options:可选参数,用于指定写入模式、编码等。(读写的一部分都有这个参数, 但不是必须的)

callback:当写入操作完成或发生错误时执行的回调函数。

fs.writeFile('./test.txt', 'test123', (err) => {
  if (err) {
    console.log(err);
  } else {
    console.log('文件创建成功');
  }
});

在上述代码中,fs.writeFile 函数用于创建一个名为 test.txt 的文件,并将字符串 test123 作为文件内容。一旦操作结束,回调函数将被执行。如果写入过程中没有遇到任何错误,将在控制台打印 文件创建成功 , 此时err为null。如果遇到错误,比如文件写入失败或路径无效,错误将被作为 err 参数传递给回调函数,并被输出到控制台。

fs.writeFile 函数的异步特性意味着在执行写入操作时,JavaScript 代码不会被阻塞,可以继续执行其他操作。

同步写入

fs.writeFileSync('./test1.txt', 'test123');

创建一个名为 test1.txt 的文件(如果该文件不存在),或者覆盖已存在的 test1.txt 文件的内容。它会立即执行写入操作,并在写入完成后才允许代码继续执行。如果文件写入成功,函数将正常结束,不会调用回调函数。如果写入过程中发生错误,例如由于权限问题或磁盘故障,将会抛出一个异常。

writeFileSync 中的 Sync 表示这是一个同步操作。这意味着 JavaScript 代码将等待文件写入操作完成后,才会继续执行下一行代码。这与异步操作(如 fs.writeFile)不同,异步操作不会阻塞代码执行,而是在文件写入完成后通过回调函数通知调用者。

使用 fs.writeFileSync 的优点是代码结构简单,不需要编写回调函数来处理写入后的逻辑。然而,由于其同步特性,它会在写入文件时阻塞 JavaScript 线程,这在某些情况下可能会影响性能,尤其是在处理大量文件或需要同时执行其他操作的场景中。在这些情况下,异步版本的 fs.writeFile 可能是更好的选择。

追加内容

// 异步追加写入一个文件
fs.appendFile('./test.txt', 'test123', (err) => {
  if (err) {
    console.log(err);
  } else {
    console.log('文件追加成功');
  }
});

// 同步追加写入一个文件
fs.appendFileSync('./test1.txt', 'test123');

这两个方法与上面的两个写入方法是对应的, 参数也一至。 同时, 如果没有文件的时候也会先创建一个文件

流式写入

const ws = fs.createWriteStream('./test.txt')
ws.write('123\n\r')
ws.write('456\n\r')
ws.write('789\n\r')
// ws.end()
ws.end('10')

const ws = fs.createWriteStream('./test.txt'):使用 fs 模块创建一个可写流(Write Stream)对象 ws,并指定要写入的文件路径。如果文件不存在,该函数会自动创建这个文件。

ws.write('123\n\r'):使用 write 方法向文件中写入内容。这里写入的是字符串 123,并在末尾添加了换行符 \n\r,表示回车换行,用于分隔不同的行。

ws.write('456\n\r'):与上一行类似,这里写入了字符串 456,同样在末尾加上了换行符。

ws.write('789\n\r'):写入了字符串 789,并在末尾加上了换行符。

ws.end():使用 end 方法来结束写入操作。调用 end 之后,就不能再对这个流对象写入任何内容了。该方法还可以接收一个数据参数,并将其作为文件的最后一部分数据写入.

同步/异步读取

读取也分为同步和异步

// 异步读取文件
fs.readFile('./test.txt', (err, data) => {
  if (err) {
    console.log(err)
  } else {
    console.log(1)

    console.log(data.toString())
  }
})
// 同步读取文件
const msg = fs.readFileSync('./test.txt')
console.log(2)
console.log(msg.toString()) // 转换为字符串

打印

2
test123
1
test123

fs.readFile是一个异步读取文件的操作。它接受三个参数:文件路径、配置项(非必需)和一个回调函数。回调函数在读取文件操作完成后被调用。它有两个参数:err 和 data。如果读取文件过程中发生错误,err 将是一个错误对象,包含错误的详细信息。如果读取成功,err 将是 null,data 将包含文件的内容作为一个 Buffer 对象。在回调函数中,你可以通过检查 err 来处理错误,并使用 data.toString() 将 Buffer 对象转换为字符串进行进一步的处理或输出。

const msg = fs.readFileSync('./test.txt'): 这是一个同步读取文件的操作。与异步操作不同,readFileSync 会阻塞代码执行,直到文件内容被完全读取。它返回文件的内容作为一个 Buffer 对象。在你的代码中,随后使用 console.log(msg.toString()) 将这个 Buffer 对象转换为字符串,并打印到控制台。

异步读取(readFile)适用于需要同时执行其他任务的情况,因为它不会阻塞线程。同步读取(readFileSync)在文件内容必须立即使用且不关心阻塞的情况下使用,例如在加载配置文件时。

流式读取

const rs = fs.createReadStream('./test.txt')
rs.on('data', (data) => {
  console.log(data.toString())
})
rs.on('end', () => {
  console.log('读取结束')
})
rs.on('error', (err) => {
  console.log(err)
})

fs.createReadStream创建一个可读流(rs)对象,用于以流的方式读取文件 'test.txt' 的内容。它使用事件监听器来处理读取过程中的不同事件, 读取本身就是一个异步的操作。

rs.on('data', (data) => {...})当流中有新的数据块可用时,触发 'data' 事件,并通过回调函数处理这个数据块。

rs.on('end', () => {...})当流中没有更多数据可读时,触发 'end' 事件,表示读取过程结束。

rs.on('error', (err) => {...})当在读取文件过程中发生错误时,触发 'error' 事件。

流式读取方式允许开发者在处理大文件时,不必一次性将整个文件读入内存,从而节省内存资源,并且能够更高效地处理数据。

删除

异步删除

fs.unlink('./test.txt', (err) => {
  if (err) {
    console.log(err)
    return
  } 
  console.log('文件删除成功')
})

err与上面几个异步操作一样, 成功时为null

同步删除

fs.unlinkSync('./test1.txt') 

同步删除出错时, 会直接抛出一个异常

重命名

同步

fs.renameSync('./test.txt', './test2.txt')

过程中如果出现问题也是直接抛出异常

异步

fs.rename('./test2.txt', './test.txt', (err) => {
  if (err) {
    console.log(err)
  } else {
    console.log('文件重命名成功')
  }
})

将test2重命名为text。如果重命名成功,err 将是 null。如果在重命名过程中发生错误(例如文件不存在或没有权限重命名),err 将包含错误信息

拷贝

除了api方法, 其他的同上面的api用法都一样

同步

fs.copyFileSync('./test.txt', './test4.txt')

异步

fs.copyFile('./test2.txt', './test.txt', (err) => {
  if (err) {
    console.log(err)
    return
  } console.log('文件复制成功')
})

其他api都可以上node官网查看