一、文件读取
异步:fs.readFile(filename,[option],callback) 方法读取文件。
同步:fs.readFileSync(filename,[option],callback)
参数说明:
- filename String 文件名
- option Object 可省,基本设置
- encoding String |null default=null
- flag String default='r'
- callback Function 回调函数
例子:
var fs = require('fs'); // 引入fs模块 fs.readFile('./test.txt','utf-8', function(err, data) { // 读取文件失败/错误 if (err) { throw err; } // 读取文件成功 console.log(data.toString()); });
二、文件写入
异步:fs.writeFile(filename,data,[options],callback)方法写入文件内容。
同步:fs.writeFileSync(filename,data,[options],callback)
参数说明:
- filename String 文件名
- data String|buffer 写入的内容
- option Object 可省,基本设置
- encoding String |nulldefault='utf-8'
- mode Number default=438(aka 0666 in Octal)
-
- flag Stringdefault='w'
- callback Function 回调函数
例子:
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参数是默认设置,所以写入内容时会清空原来的内容,如果设置flag:'a',则只会在原有的内容后面添加。如:
fs.writeFile('./test2.txt', 'test test', { 'flag': 'a' }, function(err) {...}
flag传值,r代表读取文件,w代表写文件,a代表追加。
三、使用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.open(path,flags,[mode],callback)
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+一样,但是文件存在时会报错。
2.fs.close(fd,callback)
用于关闭文件,fd是所打开文件的文件描述符。
3..fs.read(fd,buffer,offset,length,position,callback)接收6个参数。
参数说明:
- fd 文件描述符,必须接收fs.open()方法中的回调函数返回的第二个参数。
- buffer 是存放读取到的数据的Buffer对象。
- offset 指定 向buffer中存放数据的起始位置。
- length 指定 读取文件中数据的字节数。
- position 指定 在文件中读取文件内容的起始位置。
- callback 回调函数,参数如下
- err 用于抛出异常
- bytesRead 从文件中读取内容的实际字节数。
- buffer 被读取的缓存区对象。
例子:
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); }); });
4.fs.write()
fs.write(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); }); });
四、创建目录
fs.mkdir(path,[mode],callback)
参数说明:
path是需要创建的目录,
[mode]是目录的权限(默认是0777),
callback是回调函数。
var fs = require('fs'); // 引入fs模块
// 创建 newdir 目录
fs.mkdir('./newdir', function(err) {
if (err) {
throw err;
}
console.log('make dir success.');
});
删除目录可以用fs.rmdir(path,callback);但是只能删除空目录。
使用fs.readdir(path,callback)读取文件目录。
var fs = require('fs'); // 引入fs模块
fs.readdir('./newdir', function(err, files) {
if (err) {
throw err;
}
// files是一个数组
// 每个元素是此目录下的文件或文件夹的名称
console.log(files);
});
五、文件拷贝
小文件拷贝
我们使用 NodeJS 内置的 fs 模块简单实现这个程序如下。
var fs = require('fs');
function copy(src, dst) {
fs.writeFileSync(dst, fs.readFileSync(src));
}
function main(argv) {
copy(argv[0], argv[1]);
}
main(process.argv.slice(2));
以上程序使用 fs.readFileSync 从源路径读取文件内容,并使用 fs.writeFileSync 将文件内容写入目标路径。
豆知识: process 是一个全局变量,可通过 process.argv 获得命令行参数。由于 argv[0] 固定等于 NodeJS 执行程序的绝对路径,argv[1] 固定等于主模块的绝对路径,因此第一个命令行参数从 argv[2] 这个位置开始。
大文件拷贝
上边的程序拷贝一些小文件没啥问题,但这种一次性把所有文件内容都读取到内存中后再一次性写入磁盘的方式不适合拷贝大文件,内存会爆仓。对于大文件,我们只能读一点写一点,直到完成拷贝。因此上边的程序需要改造如下。
var fs = require('fs');
function copy(src, dst) {
fs.createReadStream(src).pipe(fs.createWriteStream(dst));
}
function main(argv) {
copy(argv[0], argv[1]);
}
main(process.argv.slice(2));
以上程序使用 fs.createReadStream 创建了一个源文件的只读数据流,并使用 fs.createWriteStream 创建了一个目标文件的只写数据流,并且用 pipe 方法把两个数据流连接了起来。连接起来后发生的事情,说得抽象点的话,水顺着水管从一个桶流到了另一个桶。