Node.js的文件系统模块(File System)
File System - 文件系统模块 - requires(‘fs’)
这是node的一个核心模块,提供了操作文件的一系列API,需要使用require导入后使用。
本文将结合示例介绍node.js中文件系统模块的一系列的相对比较重要且常用的方法。
1. fs.open(path,flags,[mode],callback) , 异步打开文件。
参数:
path:要打开的文件的路径
flags:打开文件的方式:读/写
mode:设置文件的模式:读/写/执行 4/2/1 0777
callback(err,fd):回调函数,带两个参数:
err——保存打开文件失败时的信息,如果文件打开成功则为null
fd-被打开的文件的标识
flags参数选项:
r 以读取模式打开文件。如果文件不存在抛出异常。
r+ 以读写模式打开文件。如果文件不存在抛出异常。
rs 以同步的方式读取文件。
rs+ 以同步的方式读取和写入文件。
w 以写入模式打开文件,如果文件不存在则创建。
wx 类似 'w',但是如果文件路径存在,则文件写入失败。
w+ 以读写模式打开文件,如果文件不存在则创建。
wx+ 类似 'w+', 但是如果文件路径存在,则文件读写失败。
a 以追加模式打开文件,如果文件不存在则创建。
ax 类似 'a', 但是如果文件路径存在,则文件追加失败。
a+ 以读取追加模式打开文件,如果文件不存在则创建。
ax+ 类似 'a+', 但是如果文件路径存在,则文件读取追加失败。
示例:
1.txt文件内容:
hello ,this is Cynthia .
fs.js文件:
var fs = require('fs');
fs.open('1.txt','r',function (err,fd) {
//console.log(err); //null ,成功打开了文件
// console.log(fd); //3
if(err){
console.log('文件打开失败!');
}else{
console.log('文件打开成功!');
}
});
2. fs.openSync(path,flags,[mode]) , 同步打开文件。
示例:
var fs = require('fs');
var fd = fs.openSync('1.txt','r');
console.log(fd); //3
3.fs.read(fd,buffer,offset,length,position,callback) , 从指定的文档标识开始异步的读取文件数据。
参数:
fd:通过open成功打开文件时文件的标识。
buffer:buffer对象。
offset:偏移量,表示文件读取到的内容存到buffer对象时,从buffer对象的那个位置开始存,即新的内容添加到buffer中的起始位置。
length:读取文件的内容的长度,即添加到buffer中的内容的长度。
position:表示从文件的哪个地方开始读取文件的内容。
callbackerr,冷,nbf):回调函数,带三个参数:
err——保存打开文件失败时的信息,如果文件打开成功则为null
len-buffer的长度
nbf-buffer内容
示例:
var fs = require('fs');
fs.open('1.txt','r',function (err,fd) {
if(err){
console.log('文件打开失败!');
}else{ //读取文件
var buf = new Buffer(20); //读取到的文件内容将存在这个buffer对象中
console.log(buf); //<Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>
fs.read(fd,buf,1,4,null,function (err1,len,nbf) {
console.log(buf); //<Buffer 00 68 65 6c 6c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>
console.log(err1); //null
console.log(len); //4
console.log(nbf); //<Buffer 00 68 65 6c 6c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>
});
}
});
4. fs.readSync(fd,buffer,offset,length,position) , 从指定的文档标识开始同步的读取文件数据。
5.fs.write(fd,buffer,offset,length,position,callback) ,通过文件表示fd,向指定的文件写入buffer。
参数:
fd:打开的文件。
buffer:要写入的数据。
offset:buffer对象中要写入的数据的起始位置。
length:要写入的buffer数据的长度。
position:fd中的起始位置。
callback(err,len,nbf):回调函数,带三个参数:
err——保存打开文件失败时的信息,如果文件打开成功则为null
len-写入buffer的长度
nbf-写入buffer内容
示例:
var fs = require('fs');
fs.open('1.txt','r+',function (err,fd) {
if(err){
console.log('文件打开失败!');
} else{
var buf1 = new Buffer('how are you ?');
fs.write(fd,buf1, 0,buf1.length,25,function () {
console.log(arguments); //{ '0': null, '1': 13, '2': <Buffer 68 6f 77 20 61 72 65 20 79 6f 75 20 3f> }
});
}
});
1.txt文件的内容变化:
6. fs.write(fd, data[,position[,encoding]], callback) ,通过指定的fd把data写入到文档中,如果data不是buffer对象,则会把值强制转化成一个字符串。
7. fs.writeSync(fd, buffer, offset, length[,position]) ,fs.write()的同步版本
8. fs.writeSync(fd, data[,position[,encoding]]) ,fs.write()的同步版本
9. fs.close(fd, callback) , 关闭一个打开的文件。
10. fs.closeSync(fd) ,fs.close()的同步版本。
示例:
var fs = require('fs');
fs.open('1.txt','r+',function (err,fd) {
if(err){
console.log('文件打开失败!');
} else{
fs.write(fd, 'I am fine , thanks .', 25);
fs.close(fd,function () {
//这里面可以重新打开文件再进行操作等
});
}
1.txt文件内容变化:
11.fs.writeFile(filename, data [,option], callback) ,异步的将数据写入一个文件,如果文件不存在就新建,如果文件原来已经存在,则会被替换,data可以是string,也可以是buffer。
callback(e):回调函数,带一个参数,表示保存文件写入的结果,成功时为null。
12. fs.writeFileSync(filename, data, [,option]) ,fs.writeFie()的同步版本。
示例:异步写文件
var fs = require('fs');
var filename = '2.txt'; //2.txt文件原来不存在
fs.writeFile(filename, 'hello', function () {
console.log(arguments); //{ '0': null }
});
13. fs.appendFile(filename, data, [,option], callback) ,异步的将数据添加到一个文件的末尾,如果文件不存在,会新建一个文件,data可以是string,也可以是buffer。
14. fs.appendFileSync(filename, data, [,option]) , fs.appendFile()的同步版本。
示例:
var fs = require('fs');
var filename = '2.txt'; //2.txt文件在上一个演示例子中创建了
fs.appendFile(filename, ' world' ,function () {
console.log(arguments);
});
15. fs.exits(path, callbakc) ,检查指定路径的文件或者目录是否存在。
callback(e):回调函数,带一个参数,文件存在时为true,不存在时为false。
186. fs.exitsSync(path) ,fs.exits()的同步版本。
示例:判断一个文件是否存在,存在时追加问价内容,不存在则创建。
//异步模式
var fs = require('fs');
var filename = '2.txt';
fs.exists(filename,function (err) { //判断文件是否存在
console.log(err); //true表示存在,false表示不存在
if(!err){ //文件不存在
fs.writeFile(filename,'hello',function (e) {
if(e){
console.log('创建文件出错了!');
}else{
console.log('创建文件成功!');
}
});
}else{ //文件存在
fs.appendFile(filename, ' world',function (er) {
if(er){
console.log('添加文件内容失败!');
}else{
console.log('添加文件内容成功!');
}
});
}
});
//同步模式
var fs = require('fs');
var filename = '3.txt';
if(!fs.existsSync(filename)){
fs.writeFileSync(filename,'hello');
console.log('新文件创建成功!');
}else{
fs.appendFileSync(filename, ' world');
console.log('追加文件内容成功!')
}
17. fs.readFile(filename, [option], callback) ,异步读取一个文件的全部内容。
callback(err,data):回调函数,带2个参数,err表示是否读取到文件,成功时err为null,data表示读取的文件内容。
18. fs.readFileSync(filename, [option]) ,fs.readFile()的同步版本。
示例:
var fs = require('fs');
fs.readFile('2.txt', function (err,data) {
console.log(arguments);
if(err){
console.log('读文件内容失败!');
}else{
console.log(data.toString()); //输出读到的2.txt文件的内容
}
});
19. fs.unlink(path, callback) ,删除一个文件。
callback(err),回调函数,带一个参数,err为null时表示成功删除,否则err保存删除失败的信息。
20. fs,unlinkSync(path) , fs.unlink()的同步版本。
示例:
fs.unlink('1.txt', function (err) {
if(err){
console.log('删除失败!');
}else{
console.log('删除成功!');
}
console.log(err); //(删除成功!) null
});
21. fs.rename(oldPath,newPath,callback) ,重命名文件。
callback(err),回调函数,带一个参数,成功重命名文件时,err为null。
22. fs.renameSync(oldPath,newPath) ,fs.rename()的同步版本。
示例:
fs.rename('2.txt','2.new.txt',function () {
console.log(arguments);
});
23. fs.stat(path, callback) ,读取文件信息。
24. fs.statSync(path,callback) ,fs.stat()的同步版本。
callback(err,stats):回调函数,成功时候,err为null,stats保存文件的属性信息。
示例:
fs.stat('1.txt', function (err,stats) {
console.log(err);
console.log(stats);
});
stats类中的方法有:
stats.isFile() 如果是文件返回 true,否则返回 false。
stats.isDirectory() 如果是目录返回 true,否则返回 false。
stats.isBlockDevice() 如果是块设备返回 true,否则返回 false。
stats.isCharacterDevice() 如果是字符设备返回 true,否则返回 false。
stats.isSymbolicLink() 如果是软链接返回 true,否则返回 false。
stats.isFIFO() 如果是FIFO,返回true,否则返回 false。FIFO是UNIX中的一种特殊类型的命令管道。
stats.isSocket() 如果是 Socket 返回 true,否则返回 false。
25. fs.watch(filename, [option], [listener]) ,观察指定路径的改变,filename路径可以是文件也可以是目录。
示例:监听文件状态的变化
var filename = '1.txt';
fs.watch(filename, function (ev,fn) {
console.log(ev);
if(fn){ //判断fn事件是否支持
console.log(fn + '发生了改变');
}else{
console.log('......');
}
});
26. fs.mkdir(path,[mode],callback) ,创建一个文件夹。
27. fs.mkdirSync(path,[mode]) ,fs.mkdir()的同步版本。
28. fs.rmdir(path, callback) ,删除一个文件夹。
29. fs.rmdirSync(path) , fs.rmdir()的同步版本。
示例:
//创建文件夹
fs.mkdir('./1', function () {
console.log(arguments); //{ '0': null }
});
//删除文件夹
fs.rmdir('./2', function () {
console.log(arguments); //{ '0': null }
});
30. fs.readdir(path, callback) ,读取文件夹。
callback(err,fileList):回调函数,包含2个参数,成功读取到文件夹时,err为null,fileList是一个数组,保存读取到的文件夹下的所有文件和文件夹。
31. fs.readSync(path) ,fs.read()的同步版本。
示例1:
fs.readdir('../fs', function (err,fileList) {
console.log(err);
console.log(fileList); //fileList是一个数组,存储读取目录下的全部文件、文件夹
});
示例2:列出指定目录下的文件,并指出是文件还是文件夹等。
fs.readdir('../fs', function (err,fileList) {
fileList.forEach(function (f) {
fs.stat(f,function (err, info) {
//console.log(arguments);
switch (info.mode){
case 16822:
console.log('[文件夹] ' + f);
break;
case 33206:
console.log('[文件] ' + f);
break;
default:
console.log('其它文件 ' + f);
break;
}
});
});
});
ps:如若对本文还有任何的意见或建议,欢迎联系本人或留言。