Node.js文件系统模块,也称作fs模块,作为Node.js内置API,提供了许多非常实用的函数来访问文件系统并与文件系统进行交互。写这篇文章用以总结常用核心API——读写文件操作以及文件路径的处理。其余API参照官方核心文档 fs 文件系统 | Node.js API 文档... 或菜鸟教程 Node.js 文件系统 | 菜鸟教程
作为 Node.js 核心的组成部分,可以通过简单地引用来使用它:
const fs = require('fs');
使用fs.readFile()方法,可以读取指定文件中的内容,语法格式如下:
fs.readFile(path[, options], callback)
参数1(必选):字符串,表示文件的路径
参数2(可选):表示读取文件的编码格式
参数1(必选):回调函数,异步处理读取文件后的结果
示例如下:
// 导入fs模块,来操作文件
const fs = require('fs');
fs.readFile('HelloWorld.txt', 'utf8', function (err, dataStr) {
if (err) {
return console.log('读取文件失败!错误信息为:' + err.message);
}
console.log("读取文件成功!结果为:" + dataStr);
})
处理读取文件结果的回调函数同时也接收两个参数:第一个参数包含错误信息(读取文件成功时其值为null),第二个参数为读取的数据(读取失败时其为undefined)
因文件操作为异步操作,另外也可以使用同步版本的fs.readFileSync():
const fs = require('fs');
let data = fs.readFile('HelloWorld.txt', 'utf8');
console.log("同步读取: " + data.toString());
因为fs.readFileSync()为同步调用,所以没有回调函数作为参数传入
注:fs.readFile()与fs.readFileSync()都会在返回数据之前将文件内容读取到内存中,一般不使用readFileSync(),防止读取大文件时消耗内存和影响程序执行的速度
使用fs.writeFile()方法,可以写入内容到指定文件中,语法格式如下:
fs.writeFile(path, data[, options], callback)
参数1(必选):字符串,表示文件的路径
参数2(必选):字符串,表示要写入文件的内容
参数3(可选):表示读取文件的编码格式,默认为utf8
参数4(必选):文件写入完成后的回调函数
示例如下:
let fs = require('fs');
let data = "你爱我,我爱你,蜜雪冰城甜蜜蜜"
fs.writeFile('HelloWorld.txt', data, 'utf8', function (err) {
if (err) {
console.log('写入文件失败!')
}
return console.log('写入文件成功!')
})
不同于读取文件,文件写入完成后的回调函数只接收一个参数:包含错误信息的参数(文件写入成功时值为null)
注:该方法在文件存在的情况下会替换文件的内容;在文件不存在时会根据路径自动创建文件并写入内容;除此以外返回错误信息;
另外也有对应的同步版本的fs.writeFileSync():同步执行,无需回调函数,写入大文件时消耗内存和影响程序执行的速度
将内容追加到文件末尾的方法是fs.appendFile(),语法格式同fs.wirteFile():
fs.appendFile(path, data[, options], callback)
let fs = require('fs');
fs.appendFile("HelloWorld.txt", '一点东西', 'utf8', function (err) {
if (err) {
console.log('追加失败~');
return;
}
console.log('追加成功!');
})
同时也有其对应的同步版本的appendFileSync()
不论是读取或是写入文件的操作,第一个接收的参数永远是文件所在的路径,该路径会在代码运行时同执行node命令所处的目录进行动态拼接出操作文件的完整路径。
若我们经常以 ./ 或者 ../ 符号开头的相对路径作为文件的操作路径时,很容易出现路径动态拼接错误。
解决方案一:
于是我们可能会采用将操作路径直接采用文件的绝对路径作为第一个参数传入
let fs = require('fs');
let data = "一点东西"
fs.writeFile('C:\\Users\\林木木\\Desktop\\node\\fs文件系统模块\\HelloWorld.txt', data, 'utf8', function (err) {
if (err) {
console.log('写入文件失败!')
}
return console.log('写入文件成功!')
})
but:如此写会导致代码移植性很差,不利于维护
解决方案二:
node.js提供了__dirname用以表示当前文件所处的目录,因此我们可以改为:
let fs = require('fs');
let data = "一点东西"
fs.writeFile(__dirname + 'HelloWorld.txt', data, 'utf8', function (err) {
if (err) {
console.log('写入文件失败!')
}
return console.log('写入文件成功!')
})
由此,由__dirname与文件操作路径动态地拼接为文件的完整路径,更有利于代码的维护。