node.js 之 fs 文件操作
本文主要是 讲述 用node.js实现读写操作 、其他的文件操作不做过多的讲述
node.js 之 fs 模块
同步和异步
Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。
注意: 回调函数的参数 错误优先
异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。但是使用异步或者同步方法,看你个人业务需求来定。
一、fs.readFile() 异步方法
创建一个 text.txt 文件然后 内容自定义
在 text.txt 同级别目录下创建 file.js
file.js 内容如下
const fs = require('fs')
fs.readFile('text.txt', function (err, data) {
if (err) {
return console.error(err)
}
console.log('异步读取:' + data.toString())
})
运行 file.js 文件 node ./file.js ./file.js 这个路径是看你当前的终端的位置来的 并不是固定的
二、fs.readFileSync() 同步方法
在 text.txt 文件目录下新建 fileSync.js
const fs = require('fs')
const data = fs.readFileSync('text.txt')
console.log('同步读取: '+ data.toString())
三、 fs.open 和 fs.close 以及 fs.read
下面这个例子会用到这三个东西 所以 简单介绍一下 都是 异步状态下
-
fs.open 打开文件
语法格式 fs.open(path, flags[, mode], callback)
path - 文件的路径。
flags - 文件打开的行为。具体值详见下文。
mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)。
callback - 回调函数,带有两个参数如:callback(err, fd)。 -
fs.close 关闭文件
语法格式 fs.close(fd, callback)
fd - 通过 fs.open() 方法返回的文件描述符。
callback - 回调函数,没有参数。
- fs.read 异步模式下读取文件
语法格式 fs.read(fd, buffer, offset, length, position, callback)
fd - 通过 fs.open() 方法返回的文件描述符
buffer - 数据写入的缓冲区
offset - 缓冲区写入的写入偏移量
length - 要从文件中读取的字节数
position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取
callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象
接下来我们创建 file.js 文件,代码如下所示:
const fs = require('fs')
const buf = new Buffer.alloc(1024)
console.log('准备打开文件');
// 异步
// r+ 是以读写模式打开文件。如果文件不存在抛出异常 ----> 读写 会抛出异常
fs.open('text.txt', 'r+', function (err, fd) {
if (err) {
return console.error(err);
}
console.log('文件打开成功');
console.log('准备读取文件');
fs.read(fd, buf, 0, buf.length, 0, function (err, bytes) {
if (err) {
return console.error('读取文件失败:' + err);
}
// 仅输出读取的字节
if (bytes > 0) {
console.log(buf.slice(0, bytes).toString());
}
// 关闭文件
fs.close(fd, function (err) {
if (err) {
console.log('关闭文件失败:' + err);
}
console.log('文件关闭成功');
})
})
})
console.log('你先我先');
四、写入文件
异步写入文件
创建 dev.js
const fs = require('fs')
console.log(1);
// 异步写入
fs.readFile('dev.js', function (err, data) {
if (err) {
return console.error('读取文件失败:' + err);
}
fs.writeFile('index.js', data.toString(), function (err) {
if (err) {
return console.error('写入文件失败:' + err);
}
})
console.log(12);
})
console.log(123);
const config = require('./index.js')
console.log(config.NODE_ENV, 'config.js');
同步写入
const fs = require('fs')
console.log(1);
// 同步写入
const data = fs.readFileSync('dev.js')
fs.writeFileSync('index.js', data.toString(), function (err) {
if (err) {
console.log('12-1');
return console.error(err);
}
console.log(12);
})
console.log(123);
const config = require('./index.js')
console.log(config.NODE_ENV, 'config.js');
五、删除文件
语法 fs.unlink(path, callback)
path: 路径
callback: 回调, 没有参数
const fs = require('fs')
// 假设 当前js 文件同级别中 有一个 input.txt 文件
fs.unlink('input.txt', function(err){
if (err) {
alter('失败咯')
}
})
六、创建目录
语法 fs.mkdir(path, options, callback)
path: 路径
options: 配置项
callback: 回调
options 可以有两个参数
recursive: 是否以递归的方式创建目录 默认为 false
mode 目录权限 默认为 0777
recursive: true 当你没有这个文件夹的时候也会创建
const fs = require('fs')
// 假设 当前js 文件同级别中 有一个 input.txt 文件
fs.mkdir('input', function(err){
if (err) {
alter('失败咯')
}
})
fs.mkdir('file/mkdir', { recursive: true }, function(err){
if (err) {
alter('失败咯')
}
})
七、读取目录
语法 fs.readdir(path, callback)
path: 路径
callback: 回调 参数 err, fileNameArray
fileNameArray: 是子级目录的数组
const fs = require('fs')
fs.readdir('file', function(err, fileNameArray){
if (err) {
alter('失败咯')
} else {
console.log(fileNameArray)
// file 这个文件夹下面的 子文件名称(不包含 file/files/...)
}
})
八、删除目录
语法 fs.rmdir(path, callback)
这个删除 我相信你看了语法就已经 会了 例子省略