该模块是核心模块,使用需要用require导入后使用。
在这篇文章中,我主要介绍一些File System的一些方法和使用。
当然,在node官网中也有相对应的api文档,更加详细的可以查阅官网。
api路径为:http://nodejs.cn/doc/node/fs.html
一:fs.open 和 fs.openSync
1、fs.open(path, flags, [mode], callback);//异步打开一个文件
对应参数:
path:要打开的文件路径
flags:打开文件的方式,(读/写)
[mode]:设置文件的读写模式 读/写/执行 4/2/1(这个参数在windows系统下是没有什么区别的)
callback:回调
err:文件打开失败的错误保存在err中,如果成功err为Null
fd:被打开文件的标识
在这里,详细介绍一下flags值的多种形式的意思:
'r' - 以读取模式打开文件,文件不存在时会抛出异常
'r+' - 以读写模式打开文件,文件不存在时抛出异常
'rs' - 使用同步模式打开并读取文件。指示操作系统忽略本地文件系统缓存
'rs+' - 以同步的方式打开,读取 并 写入文件
注意:这不是让fs.open变成同步模式的阻塞操作。如果想要同步模式请使用fs.openSync
'w' - 以读取模式打开文件,如果文件不存在则创建
'wx' - 和 ' w ' 模式一样,但是文件存在则返回失败
'w+' - 以读写模式打开文件,如果文件不存在则创建,文件存在时,原有文件会被全部清空,再进行写入动 作
'wx+' - 和 ' w+ ' 模式一样,但是文件存在则返回失败
'a' - 以追加模式打开文件,如果文件不存在则创建
'ax' - 和 ' a ' 模式一样,但是文件存在则返回失败
'a+' - 以读取追加模式打开文件,如果文件不存在则创建
'ax+' - 和 ' a+ ' 模式一样,但是文件存在则返回失败
var fs = require('fs'); fs.open('test.js','r',function(err,fd){ if(err){ console.log("文件打开失败"); }else{ console.log("文件打开成功"); console.log(fd); } });
2、fs.openSync(path, flags ,[mode]) ; //同步打开一个文件 返回值为fd
var fs = require('fs'); var fd = fs.openSync('test.js','r'); console.log("同步方式:"+fd);
二:fs.readFile 和 fs.readFileSync
1、fs.readFile(file[, options], callback); //异步读取一个文件
2、fs.readFileSync(file[, options])同步读取一个文件
这两个方法我就不在这里详细讲解了,在我另一篇文章中有重点介绍着两个方法的使用和区别。node中的文件读取---fs和path
三:fs.write 和 fs.writeSync
1、fs.write(fd, buffer, offset, length, [position], callback); //异步通过文件的标识fd,向制定的文件中写入 buffer
fs.write方法中各个参数的意思:
fd
buffer:要写入的数据
offset:偏移量(buffer对象中要写入数据的偏移起始位置)
length:写入buffer数据的长度
position :fd的起始位置
callback:回调
var fs = require('fs'); fs.open('3.txt','w+',function(err,fd){ if(err){ console.log("文件打开失败"); }else{ console.log("文件打开成功"); console.log(fd); var buffer = new Buffer('abc'); fs.write(fd,buffer,0,3,10,function(){ }); fs.close(fd,function(){ }); } });
2、fs.write(fd, data, [position], [encoding], callback); //以字符串形式写文件
把data通过指定fd写入到文档中,如果对象不是buffer对象的实例,则会把值强制转换为一个字符串。
var fs = require('fs'); fs.write(fd,'1234',5,'utf-8',function(){});
3、fs.writeSync(fd, buffer, offset, length, [position]); // 同步写入文件
注意:同步类型的函数都是没有回调函数的。
三、fs.close 和 fs.closeSync
1、fs.close(fd, callback) ; //异步关闭一个文件
关闭一个打开的文件(打开一个文件,操作完成之后完成之后最好及时的关掉该文件)。
2、fs.closeSync(fd); //同步关闭一个文件
四:fs.writeFile 和fs.writeFileSync
1、fs.writeFile(file, data, [options], callback); //异步的将数据写入一个文件
如果文件不存在则创建,如果文件原先存在,原先的内容则会被替换。data是一个String,也可以是一个原生 buffer。存入的数据会覆盖原来文件的内容。但是在使用fs.writeFile这个方法,在没有等到回调又再次使用这 个 方法的情况,是不安全的。var fs = require('fs'); var fileName = "1.txt"; fs.writeFile(fileName,"hello",function(err){ if(err){ console.log('出错了'); }else{ console.log('创建成功'); } });
2、fs.writeFileSync(file, data, [options]); // 同步的将数据写入一个文件
var fs = require('fs'); var fileName = "1.txt"; fs.writeFile(fileName,"hello");
五:fs.appendFile 和 fs.appendFileSync
1、fs.appendFile(file, data, [options], callback); //异步的将数据添加到文件的尾部
如果文件不存在则创建,如果文件原先存在,则会被替换。data是一个String,也可以是一个原生buffer。
var fs = require('fs'); var fileName = "1.txt"; fs.appendFile(fileName,'-eee',function(err){ if(err){ console.log('出错了'); }elsr{ console.log('添加成功'); } });
2、fs.appendFileSync(file, data, [options]); //同步的将数据添加到文件的尾部
var fs = require('fs'); var fileName = "1.txt"; fs.appendFile(fileName,'-eee');
六:fs.exists 和 fs.existsSync
1、fs.exists(path, callback); //异步的判断文件是否存在
该方法检查指定路径的文件或者目录是否存在。 其实最好的办法就是fs.open的方法,根据回调函数返回来的值来判断文件是否存在。
var fs = require('fs'); var fileName = "1.txt"; if(fs.existsSync(fileName)){ if(fs.writeFileSync(fileName,"hello")){ console.log('出错了'); }else{ console.log('创建成功'); } }else{ if(fs.appendFile(fileName,'-eee'){ if(err){ console.log('出错了'); }else{ console.log('添加成功'); } } }
其实上面这部分代码可以用fs.appendFile这个方法就可以实现这个功能了。
2、fs.existsSync(path); //同步的判断文件是否存在
七:fs.link 和 fs.linkSync
1、fs.link(srcpath, dstpath, callback); //异步方式删除一个文档
2、fs.linkSync(srcpath, dstpath); /同步方式删除一个文档
var fs = require('fs'); var fileName = "1.txt"; fs.unlink(fileName,function(err){ if(err){ console.log('删除失败'); }else{ console.log('删除成功'); } });
八:fs.rename 和 fs.renameSync
1、fs.rename(oldPath, newPath, callback); //异步方式对文件进行重命名
var fs = require('fs'); var fileName = "1.txt"; fs.rename(fileName,'2-new.txt',function(){ console.log(arguments); });
2、fs.renameSync(oldPath, newPath); //同步方式对文件进行重命名
九:fs.stat 和 fs.statSync
1、fs.stat(path, callback) ; // 异步方式读取文件状态信息
var fs = require('fs'); var fileName = "1.txt"; fs.stat(fileName,function(){ console.log(arguments); });
2、fs.statSync(path); //同步方式读取文件状态信息
十:fs.watch
1、 fs.watch(filename [,options], [listener]); // 观察路径的变化,可以是文档或者目录
这个方法不稳定,不同的版本会有调整。该功能依赖于操作系统底层提供的方法来监视文件系统的变化。
fs.watch(fileName,function(ev,fn){ //ev:当前事件 //fn:当前监听的文件 console.log(ev); if(fn){ console.log(fn:"发生了变化"); }else{ console.log("..."); } });
十一:fs.mkdir 和 fs.mkdirSync
1、fs.mkdir(path, [mode], callback); // 异步创建文件夹
在当前目录下创建一个名为‘1’的文件夹
var fs = require('fs'); fs.mkdir('./1',function(){ console.log(arguments); });
2、fs.mkdirSync(path, [mode]); //同步创建文件夹
十二:fs.readdir 和 fs.readdirSync
1、fs.readdir(path, callback); //异步读取文件夹
var fs = require('fs'); fs.readdir('../node',function(err,fileList){ console.log(fileList); });以下代码来读取上层node目录下的全部文件(包括文件夹),执行结果如下
现在我们来完善一下代码,来明确出哪些是文件夹,哪些是文件。
var fs = require('fs'); fs.readdir('../node',function(err,fileList){ //console.log(fileList); fileList.forEach(function(f){ fs.stat(f,function(e,info){ switch (info.mode){ case 16822: console.log('[文件夹] '+ f); break; case 33206: console.log('[文件] '+ f); break; } }); }); });
执行结果为:
2、fs.readdirSync(path); //同步读取文件夹
十三:
1、fs.rmdir(path, callback); // 异步删除文件夹
var fs = require('fs'); fs.rmdir('./1',function(){ console.log(arguments); });
2、fs.rmdirSync(path); //同步删除文件夹