承接上文,继续补充学习Nodejs的内置模块
fs
fs模块
fs模块就是Nodejs提供的用于操作文件的内置模块。
引入fs
const fs = require("fs");
需要注意的是,Nodejs文件系统模块fs中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile和同步的fs.readFileSync。异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。
获取文件信息
const fs = require('fs');
const path = require('path');
fs.stat(path.join(__dirname, 'test.txt'), (err, stat) => {
// atime 文件访问时间
// ctime 文件的状态信息发生变化的时间(比如文件的权限)
// mtime 文件数据发生变化的时间
// birthtime 文件创建的时间
console.log(err); // 错误信息
console.log(stat); // 文件信息
console.log(stat.atime);
console.log(stat.ctime);
console.log(stat.mtime);
console.log(stat.birthtime);
});
// 同步操作
// fs.statSync('路径', function);
读取文件
fs.readFile(path.join(__dirname, 'data.txt'), 'utf8', (err, data) => {
console.log(data);
});
// 同步操作
// fs.readFileSync('路径', '编码参数', function);
需要注意的是,如果没有第二个编码参数'utf8',那么得到的就是Buffer实例对象,如果有编码参数,则回调函数就会返回对应编码的数据字符串
写入文件
fs.writeFile(path.join(__dirname, 'test.txt'), 'hello', 'utf8', (err) => {
if(!err){
console.log('文件写入成功');
}
});
此时如果没有传入指定的编码参数,那么,写入的就需要是Buffer实例对象;
let buf = Buffer.from('hi');
fs.writeFile(path.join(__dirname, 'test.txt'), buf, (err) => {
if(!err){
console.log('文件写入成功');
}
});
// 同步操作
fs.writeFileSync('路径', '写入内容','编码参数', function);
流式操作
一种是 buffer 模式,一种是 stream 模式,buffer 模式就是取完数据一次性操作,stream 模式就是边取数据边操作。原来的方式在处理数据量较大的文件时不能分块处理,导致速度慢,内存容易爆满。
读取文件
const path = require('path');
const fs = require("fs");
let data = '';
// 创建可读流
let readerStream = fs.createReadStream(path.join(__dirname, 'input.txt'));
// 设置编码为 utf8。
readerStream.setEncoding('utf8');
// 处理流事件
// 有有数据可读时触发
readerStream.on('data', (chunk) => {
data += chunk;
});
// 当没有更多的数据可读时触发
readerStream.on('end', () => {
console.log(data);
});
// 在读取或写入过程中发生错误时触发
readerStream.on('error', (err) => {
console.log(err.stack);
});
写入文件
const path = require('path');
const fs = require("fs");
let data = '你好美,么么哒';
// 创建一个可以写入的流,写入到文件 output.txt 中
let writerStream = fs.createWriteStream(path.join(__dirname, 'output.txt'));
// 处理流事件
// 所有数据已被写入到底层系统时触发
writerStream.on('finish', () => {
console.log("写入完成。");
});
// 在读取或写入过程中发生错误时触发
writerStream.on('error', (err) => {
console.log(err.stack);
});
// 使用 utf8 编码写入数据
writerStream.write(data, 'utf8');
// 标记文件末尾,表明后面没数据要再写入了
writerStream.end();
文件拷贝
Nodejs的文件拷贝有两种方式:
// 第一种方式:
const path = require('path');
const fs = require('fs');
let spath = path.join(__dirname, 'src.txt');
let dpath = path.join(__dirname, 'dest.txt');
// pipe 的作用直接把输入流和输出流 readStream.pipe(writeStream);
fs.createReadStream(spath).pipe(fs.createWriteStream(dpath));
// 第二种方式:
const path = require('path');
const fs = require('fs');
let spath = path.join(__dirname, 'src.txt');
let dpath = path.join(__dirname, 'dest.txt');
// 默认情况下将创建或覆盖目标文件。
fs.copyFile(spath, dpath, (err) => {
if(err){
throw err;
}
console.log('源文件已拷贝到目标文件');
});
目录操作
- fs.mkdir(path[, mode], callback) 创建目录
- fs.readdir(path[, options], callback) 读取目录
- fs.rmdir(path, callback) 删除目录