Node.js 文件系统
参考https://www.runoob.com/nodejs/nodejs-fs.html
Node.js提供一组类似UNIX(POSIX)标准的文件操作API。
var fs = require('fs');
异步和同步
- fs模块中的方法均有异步和同步两个版本,例如读取文件有fs.readFile()和fs.readFileSync();
- 异步方法的最后一个参数为回调函数,回调函数的第一个参数为错误信息err;
- 推荐使用异步方法,性能更高,速度更快,且无阻塞。
var fs = require('fs');
// 异步读取
fs.readFile('input.txt', (err, data)=>{
if(err){
console.error(err);
return;
}
console.log('异步读取:'+data.toString());
});
// 同步读取
var data = fs.readFileSync('input.txt');
console.log('同步读取:'+data.toString());
console.log('程序执行结束');
结果:
同步读取:菜鸟教程官网地址:www.runoob.com
文件读取实例
程序执行结束
异步读取:菜鸟教程官网地址:www.runoob.com
文件读取实例
打开文件
fs.open(path, flags[, mode], callback)
- path:文件路径
- flags:文件打开方式,和python类似
- mode:设置文件权限,默认为0666(可读可写)
- callback:回调函数,带两个参数(err, fd)
flags参数
- r:只读,不存在则抛异常
- r+:读写,不存在则抛异常
- rs:同步读
- rs+:同步读写
- w:写,不存在则创建
- wx:创建并写,如果已存在则写失败
- w+:读写,不存在则创建
- wx+:读写,如果已存在则读写失败
- a:追加模式打开,不存在则创建
- ax:追加模式打开,如果已存在则追加失败
- a+:读取追加模式打开,不存在则创建
- ax+:读取追加模式打开,如果已存在则读取追加失败
r写,w读,+赋予额外的读或写权限,a追加,x已存在则失败,不带x读不存在则抛异常,不带x写不存在则抛异常
获取文件信息
fs.stat(path, callback)
- path:文件路径
- callback:回调函数,带两个参数(err, stats),stats是fs.Stats对象
fs.stats(path)执行后,会返回fs.Stats对象,通过该对象的方法判断文件的相关属性,例如判断是否为文件:
var fs = require('fs');
fs.stat('./input.txt',(err, stats)=>{
console.log(stats.isFile());
});
console.log('程序执行结束');
结果:
程序执行结束
true
第一次执行的时候提示说:
console.log(stat.isFile());
^
ReferenceError: stat is not defined
后来还去查了下文档,发现没写错,后来莫名其妙就可以了……而且我的是v14.15.2。
stats类中的方法
- stats.isFile()
- stats.isDirectory()
- stats.isBlockDevice():是否是块设备https://baike.baidu.com/item/%E5%9D%97%E8%AE%BE%E5%A4%87/2413231?fr=aladdin
- stats.isCharacterDevice():是否是字符设备https://baike.baidu.com/item/%E5%AD%97%E7%AC%A6%E8%AE%BE%E5%A4%87/6637035?fr=aladdin
- stats.isSymbolicLink():是否是软链接https://baike.baidu.com/item/%E8%BD%AF%E9%93%BE%E6%8E%A5/7177481?fr=aladdin
- stats.isFIFO():是否是FIFO,UNIX中的一种特殊类型的命令管道。
- stats.isSocket():是否是Socket。
var fs = require('fs');
console.log('准备打开文件!');
fs.stat('input.txt', (err, stats)=>{
if(err){
return console.log(err);
}
console.log(stats);
console.log('读取文件信息成功!');
});
console.log('程序执行结束');
结果:
准备打开文件!
程序执行结束
Stats {
dev: 3127162932,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: 4096,
ino: 2533274790624099,
size: 60,
blocks: 0,
atimeMs: 1609120186409.6863,
mtimeMs: 1609120186409.6863,
ctimeMs: 1609120186409.6863,
birthtimeMs: 1609120178188.6562,
atime: 2020-12-28T01:49:46.410Z,
mtime: 2020-12-28T01:49:46.410Z,
ctime: 2020-12-28T01:49:46.410Z,
birthtime: 2020-12-28T01:49:38.189Z
}
读取文件信息成功!
写入文件
异步写入文件
fs.writeFile(file, data[, options], callback)
- file:文件或文件描述符
- data:待写入数据,String或Buffer对象
- options:{encoding, mode, flag},默认为{'utf8', 0666, 'w'}
- callback:回调函数,带有参数err,写入失败时返回
读取文件
异步读取
fs.read(fd, buffer, offset, length, position, callback)
使用文件描述符fd来读取文件。
- fd:通过fs.open()返回的文件描述符
- buffer:数据写入的缓冲区
- offset:数据缓冲区写入的写入偏移量
- length:要从文件中读取的字节数
- position:读取的起始位置,如果为null则从当前文件指针处
- callback:回调函数,带三个参数(err, bytesRead, buffer)
关闭文件
fs.close(fd, callback)
使用文件描述符关闭文件
- fd:通过fs.open()返回的文件描述符
- callback:回调函数,没有参数
截取文件
异步截取文件
fs.ftruncate(fd, len, callback)
使用文件描述符来截取文件
- fd:通过fs.open()返回的文件描述符
- len:文件内容的长度
- callback:回调函数,没有参数
在callback中对截取后的文件进行fs.read()、fs.write()、fs.close()等操作
删除文件
fs.unlink(path, callback)
- path:文件路径
- callback:回调函数,没有参数
创建目录
fs.mkdir(path, [, options], callback)
- path:目录路径
- options:{recursive, mode},recursive,递归创建(父级目录不存在则创建),默认为false;mode,设置目录权限,默认为0777
- callback:回调函数,没有参数
读取目录
fs.readdir(path, callback)
- path:目录路径
- callback:回调函数,带两个参数(err, files),files为文件数组列表
删除目录
异步删除目录
fs.rmdir(path, callback)
- path:目录路径
- callback:回调函数,没有参数
总结
fs中的方法一般都有同步和异步两种,异步的最后一个参数通常是一个回调函数,该回调函数的参数可能有若干个或没有;
fs.read()和fs.write()功能类似fs.readFile()和fs.writeFile(),不过提供了更底层的操作,而且是对通过fs.open()得到的文件描述符进行操作。