Node模块的分类
浏览器(客户端)中的JS
Node中的JS
在浏览器运行的js 有BOM和DOM 及网络控制等对象,Node也有各种各样的模块,但大致可分为三类:
1、核心模块
2、文件模块
3、第三方模块(npm安装的)
Node 核心模块
核心模块有哪些?
可以参考http://nodejs.cn/api/,在手册中出现的模块都是核心模块
核心模块-fs模块
文档
fs模块用于对系统文件及目录进行读写操作。
一、同步和异步
使用require('fs')载入fs模块,模块中所有方法都有同步和异步两种形式。
异步方法中回调函数的第一个参数总是留给异常参数(exception),如果方法成功完成,该参数为null或undefined。
异步写法demo:有一个回调函数。
var fs = require('fs'); // 载入fs模块
fs.unlink('/tmp/shiyanlou', function(err) {
if (err) {
throw err;
}
console.log('成功删除了 /tmp/shiyanlou');
});
同步写法demo:
var fs = require('fs');
fs.unlinkSync('/tmp/shiyanlou'); // Sync 表示是同步方法
console.log('成功删除了 /tmp/shiyanlou');
同步方法执行完并返回结果后,才能执行后续的代码。而异步方法采用回调函数接收返回结果,可以立即执行后续代码。
二、readFile读取文件
fs.readFile (path[, options], callback) 读取文件
readFile 参数说明
- path
| | | 文件名或文件描述符。 - options
- callback
- err
错误的返回 - data
| 读取的数据
- err
异步读取文件Demo
var fs = require('fs');
fs.readFile('./text.txt', 'utf-8', function (err, data) {
console.log(err);
console.log(data);
});
运行结果
同步读取文件Demo
readFile同步的写法就是没有回调函数:fs.readFileSync(filename,[options])。
例
var fs = require('fs');
var data = fs.readFileSync('./text.txt', 'utf-8',);
console.log(data);
运行结果
三、WriteFile写入文件
使用fs.writeFile(filename,data,[options],callback)写入内容到文件。
- file
| | | 文件名或文件描述符。 - data
| | | 要写入的数据 - options
- callback
- err
- err
异步写入demo
var fs = require('fs'); // 引入fs模块
// 写入文件内容(如果文件不存在会创建一个文件)
// 写入时会先清空文件
fs.writeFile('./test2.txt', 'test test', function(err) {
if (err) {
throw err;
}
console.log('Saved.');
// 写入成功后读取测试
fs.readFile('./test2.txt', 'utf-8', function(err, data) {
if (err) {
throw err;
}
console.log(data);
});
});
运行结果
因为默认flag='w'是写,会清空文件,想要追加,可以传递一个flag参数,如下。
var fs = require('fs'); // 引入fs模块
// 写入文件内容(如果文件不存在会创建一个文件)
// 传递了追加参数 { 'flag': 'a' }
fs.writeFile('./test2.txt', 'test test', { 'flag': 'a' }, function(err) {
if (err) {
throw err;
}
console.log('Saved.');
// 写入成功后读取测试
fs.readFile('./test2.txt', 'utf-8', function(err, data) {
if (err) {
throw err;
}
console.log(data);
});
});
flag传值,r代表读取文件,w代表写文件,a代表追加。
同步写入Demo
var fs = require('fs'); // 引入fs模块
var res = fs.writeFileSync('./test3.txt', 'test test', { 'flag': 'a' });
console.log(res);
var data = fs.readFileSync('./test3.txt', 'utf-8',);
console.log(data);
运行结果
四、使用fs.read和fs.write读写文件
fs.read和fs.write功能类似fs.readFile和fs.writeFile(),但提供更底层的操作,实际应用中多用fs.readFile和fs.writeFile。
使用fs.read和fs.write读写文件需要使用fs.open打开文件和fs.close关闭文件。
1、fs.read()
fs.open。
fs.open(path,flags,[mode],callback)方法用于打开文件,以便fs.read()读取。
参数说明:
- path 文件路径
- flags打开文件的方式
- [mode] 是文件的权限(可行参数,默认值是0666)
- callback 回调函数
flags值及说明如下
r :读取文件,文件不存在时报错;
r+ :读取并写入文件,文件不存在时报错;
rs :以同步方式读取文件,文件不存在时报错;
rs+ :以同步方式读取并写入文件,文件不存在时报错;
w :写入文件,文件不存在则创建,存在则清空;
wx :和w一样,但是文件存在时会报错;
w+ :读取并写入文件,文件不存在则创建,存在则清空;
wx+ :和w+一样,但是文件存在时会报错;
a :以追加方式写入文件,文件不存在则创建;
ax :和a一样,但是文件存在时会报错;
a+ :读取并追加写入文件,文件不存在则创建;
ax+ :和a+一样,但是文件存在时会报错。
fs.close(fd,[callback])
用于关闭文件,fd是所打开文件的文件描述符。
fs.read(fd,buffer,offset,length,position,callback)接收6个参数。
参数说明:
- fd 文件描述符,必须接收fs.open()方法中的回调函数返回的第二个参数。
- buffer 是存放读取到的数据的Buffer对象。
- offset 指定 向buffer中存放数据的起始位置。
- length 指定 读取文件中数据的字节数。
- position 指定 在文件中读取文件内容的起始位置。
- callback 回调函数,参数如下
- err 用于抛出异常
- bytesRead 从文件中读取内容的实际字节数。
- buffer 被读取的缓存区对象。
demo: read.js内容如下
var fs = require('fs'); // 引入fs模块
// 打开文件
fs.open('./testread.txt', 'r', function(err, fd) {
if (err) {
throw err;
}
console.log('open file success.');
var buffer = new Buffer(255);
// 读取文件
fs.read(fd, buffer, 0, 10, 0, function(err, bytesRead, buffer) {
if (err) {
throw err;
}
// 打印出buffer中存入的数据
console.log(bytesRead, buffer.slice(0, bytesRead).toString());
// 关闭文件
fs.close(fd);
});
});
2、fs.write()
fs.read(fd,buffer,offset,length[,position],callback(err,bytesWritten,buffer))接收6个参数。
参数说明:
- fd 文件描述符,必须接收fs.open()方法中的回调函数返回的第二个参数。
- buffer 是存放 将被写入的数据,buffer尺寸的大小设置最好是8的倍数,效率较高。
- offset buffer写入的偏移量。
- length (integer)指定 写入文件中数据的字节数。
- position (integer) 指定 在写入文件内容的起始位置。
- callback 回调函数,参数如下
- err 用于抛出异常
- bytesWritten从文件中读取内容的实际字节数。
- buffer 被读取的缓存区对象。
var fs = require('fs'); // 引入fs模块
// 打开文件
fs.open('./testwrite.txt', `w`, function(err, fd) {
if (err) {
throw err;
}
console.log('open file success.');
var buffer = new Buffer('shiyanlou');
// 读取文件
fs.write(fd, buffer, 0, 6, 0, function(err, bytesWritten, buffer) {
if (err) {
throw err;
}
console.log('write success.');
// 打印出buffer中存入的数据
console.log(bytesWritten, buffer.slice(0, bytesWritten).toString());
// 关闭文件
fs.close(fd);
});
});
五、目录操作
1、创建目录
使用fs.mkdir(path,[mode],callback)创建目录,path是需要创建的目录,[mode]是目录的权限(默认是0777),callback是回调函数。
demo:mkdir.js内容如下
var fs = require('fs'); // 引入fs模块
// 创建 newdir 目录
fs.mkdir('./newdir', function(err) {
if (err) {
throw err;
}
console.log('make dir success.');
});
删除目录可以用fs.rmdir(path,callback);但是只能删除空目录。
2、读取目录
使用fs.readdir(path,callback)读取文件目录。
demo:readdir.js内容如下
var fs = require('fs'); // 引入fs模块
fs.readdir('./newdir', function(err, files) {
if (err) {
throw err;
}
// files是一个数组
// 每个元素是此目录下的文件或文件夹的名称
console.log(files);
});
六、读取文件详细信息
fs.stat 同步
同步方法查看文件信息fs.statSync(path);
const fs = require('fs');
let mkdir = './mkdir';
fs.stat(mkdir, (err, stats) => {
if (err) {
console.log(`fs.stats ${mkdir} file failed~`);
} else {
console.log(`fs.stats ${mkdir} file success~`);
console.log(stats);
}
});
stats详解
Stats {
dev: 2050,文件或目录所在的设备ID,仅在UNIX有效
mode: 16877,使用数值形式代表的文件或目录的权限标志
nlink: 3,文件或目录的硬连接数量
uid: 0,文件或目录的所有者的用户ID,仅在UNIX有效
gid: 0,文件或目录的所有者的用户组ID,仅在UNIX有效
rdev: 0,为字符设备文件或块设备文件所在设备ID,仅在UNIX有效
blksize: 4096,
ino: 4197533,文件或目录的索引编号,仅在UNIX有效
size: 4096,文件尺寸,即文件中的字节数
blocks: 8,
atimeMs: 1511846425357.986,
mtimeMs: 1511846425256.986,
ctimeMs: 1511846425256.986,
birthtimeMs: 1511846425256.986,
atime: 2017-11-28T05:20:25.358Z,文件的访问时间
mtime: 2017-11-28T05:20:25.257Z,文件的修改时间
ctime: 2017-11-28T05:20:25.257Z,文件的创建时间
birthtime: 2017-11-28T05:20:25.257Z
}
fstat方法查询文件信息
使用open方法或openSync方法打开文件并返回文件描述符时,可以使用fs模块中的fstat方法查询被打开的文件信息
const fs = require('fs');
let mkdir = './mkdir';
fs.open(mkdir, 'r', (err, fd) => {
if (err) {
console.log(`open ${mkdir} file failed~`);
return false;
}
fs.fstat(fd, (err, stats) => {
if (err) {
console.log(`fstat ${mkdir} file failed~`);
return false;
}
console.log(JSON.stringify(stats));
})
})
fs.fstat结果
{
"dev": 1041887651,
"mode": 16822,
"nlink": 1,
"uid": 0,
"gid": 0,
"rdev": 0,
"ino": 4222124650663107,
"size": 0,
"atimeMs": 1519394418412.3062,
"mtimeMs": 1519394418412.3062,
"ctimeMs": 1519394418412.3062,
"birthtimeMs": 1519394418402.2554,
"atime": "2018-02-23T14:00:18.412Z",
"mtime": "2018-02-23T14:00:18.412Z",
"ctime": "2018-02-23T14:00:18.412Z",
"birthtime": "2018-02-23T14:00:18.402Z"
}