Node.js提供一组类似UNIX(POSIX)标准的文件操作API。Node导入文件系统模块(fs)语法如下所示:
varfs=require("fs")异步和同步Node.js文件系统(fs模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的fs.readFile()和同步的fs.readFileSync()。
异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。
创建input.txt文件,内容如下:
菜鸟教程官网地址:www.runoob.com文件读取实例创建file.js文件,代码如下:
varfs=require("fs");//异步读取fs.readFile('input.txt',function(err,data){if(err){returnconsole.error(err);}console.log("异步读取:"+data.toString());});//同步读取vardata=fs.readFileSync('input.txt');console.log("同步读取:"+data.toString());console.log("程序执行完毕。");以上代码执行结果如下:
$nodefile.js同步读取:菜鸟教程官网地址:www.runoob.com文件读取实例程序执行完毕。异步读取:菜鸟教程官网地址:www.runoob.com文件读取实例接下来,让我们来具体了解下Node.js文件系统的方法。
以下为在异步模式下打开文件的语法格式:
fs.open(path,flags[,mode],callback)参数参数使用说明如下:
flags参数可以是以下值:
接下来我们创建file.js文件,并打开input.txt文件进行读写,代码如下所示:
varfs=require("fs");//异步打开文件console.log("准备打开文件!");fs.open('input.txt','r+',function(err,fd){if(err){returnconsole.error(err);}console.log("文件打开成功!");});以上代码执行结果如下:
$nodefile.js准备打开文件!文件打开成功!获取文件信息语法以下为通过异步模式获取文件信息的语法格式:
fs.stat(path,callback)参数参数使用说明如下:
varfs=require('fs');fs.stat('/Users/liuht/code/itbilu/demo/fs.js',function(err,stats){console.log(stats.isFile());//true})stats类中的方法有:
接下来我们创建file.js文件,代码如下所示:
varfs=require("fs");console.log("准备打开文件!");fs.stat('input.txt',function(err,stats){if(err){returnconsole.error(err);}console.log(stats);console.log("读取文件信息成功!");//检测文件类型console.log("是否为文件(isFile)"+stats.isFile());console.log("是否为目录(isDirectory)"+stats.isDirectory());});以上代码执行结果如下:
$nodefile.js准备打开文件!{dev:16777220,mode:33188,nlink:1,uid:501,gid:20,rdev:0,blksize:4096,ino:40333161,size:61,blocks:8,atime:MonSep07201517:43:55GMT+0800(CST),mtime:MonSep07201517:22:35GMT+0800(CST),ctime:MonSep07201517:22:35GMT+0800(CST)}读取文件信息成功!是否为文件(isFile)true是否为目录(isDirectory)false写入文件语法以下为异步模式下写入文件的语法格式:
fs.writeFile(file,data[,options],callback)writeFile直接打开文件默认是w模式,所以如果文件存在,该方法写入的内容会覆盖旧的文件内容。
参数使用说明如下:
varfs=require("fs");console.log("准备写入文件");fs.writeFile('input.txt','我是通过fs.writeFile写入文件的内容',function(err){if(err){returnconsole.error(err);}console.log("数据写入成功!");console.log("--------我是分割线-------------")console.log("读取写入的数据!");fs.readFile('input.txt',function(err,data){if(err){returnconsole.error(err);}console.log("异步读取文件数据:"+data.toString());});});以上代码执行结果如下:
$nodefile.js准备写入文件数据写入成功!--------我是分割线-------------读取写入的数据!异步读取文件数据:我是通过fs.writeFile写入文件的内容读取文件语法以下为异步模式下读取文件的语法格式:
fs.read(fd,buffer,offset,length,position,callback)该方法使用了文件描述符来读取文件。
input.txt文件内容为:
菜鸟教程官网地址:www.runoob.com接下来我们创建file.js文件,代码如下所示:
varfs=require("fs");varbuf=newBuffer.alloc(1024);console.log("准备打开已存在的文件!");fs.open('input.txt','r+',function(err,fd){if(err){returnconsole.error(err);}console.log("文件打开成功!");console.log("准备读取文件:");fs.read(fd,buf,0,buf.length,0,function(err,bytes){if(err){console.log(err);}console.log(bytes+"字节被读取");//仅输出读取的字节if(bytes>0){console.log(buf.slice(0,bytes).toString());}});});以上代码执行结果如下:
$nodefile.js准备打开已存在的文件!文件打开成功!准备读取文件:42字节被读取菜鸟教程官网地址:www.runoob.com关闭文件语法以下为异步模式下关闭文件的语法格式:
fs.close(fd,callback)该方法使用了文件描述符来读取文件。
varfs=require("fs");varbuf=newBuffer.alloc(1024);console.log("准备打开文件!");fs.open('input.txt','r+',function(err,fd){if(err){returnconsole.error(err);}console.log("文件打开成功!");console.log("准备读取文件!");fs.read(fd,buf,0,buf.length,0,function(err,bytes){if(err){console.log(err);}//仅输出读取的字节if(bytes>0){console.log(buf.slice(0,bytes).toString());}//关闭文件fs.close(fd,function(err){if(err){console.log(err);}console.log("文件关闭成功");});});});以上代码执行结果如下:
$nodefile.js准备打开文件!文件打开成功!准备读取文件!菜鸟教程官网地址:www.runoob.com文件关闭成功截取文件语法以下为异步模式下截取文件的语法格式:
fs.ftruncate(fd,len,callback)该方法使用了文件描述符来读取文件。
site:www.runoob.com接下来我们创建file.js文件,代码如下所示:
varfs=require("fs");varbuf=newBuffer.alloc(1024);console.log("准备打开文件!");fs.open('input.txt','r+',function(err,fd){if(err){returnconsole.error(err);}console.log("文件打开成功!");console.log("截取10字节内的文件内容,超出部分将被去除。");//截取文件fs.ftruncate(fd,10,function(err){if(err){console.log(err);}console.log("文件截取成功。");console.log("读取相同的文件");fs.read(fd,buf,0,buf.length,0,function(err,bytes){if(err){console.log(err);}//仅输出读取的字节if(bytes>0){console.log(buf.slice(0,bytes).toString());}//关闭文件fs.close(fd,function(err){if(err){console.log(err);}console.log("文件关闭成功!");});});});});以上代码执行结果如下:
$nodefile.js准备打开文件!文件打开成功!截取10字节内的文件内容,超出部分将被去除。文件截取成功。读取相同的文件site:www.r文件关闭成功删除文件语法以下为删除文件的语法格式:
fs.unlink(path,callback)参数参数使用说明如下:
varfs=require("fs");console.log("准备删除文件!");fs.unlink('input.txt',function(err){if(err){returnconsole.error(err);}console.log("文件删除成功!");});以上代码执行结果如下:
$nodefile.js准备删除文件!文件删除成功!再去查看input.txt文件,发现已经不存在了。
以下为创建目录的语法格式:
fs.mkdir(path[,options],callback)参数参数使用说明如下:
varfs=require("fs");//tmp目录必须存在console.log("创建目录/tmp/test/");fs.mkdir("/tmp/test/",function(err){if(err){returnconsole.error(err);}console.log("目录创建成功。");});以上代码执行结果如下:
$nodefile.js创建目录/tmp/test/目录创建成功。可以添加recursive:true参数,不管创建的目录/tmp和/tmp/a是否存在:
fs.mkdir('/tmp/a/apple',{recursive:true},(err)=>{if(err)throwerr;});读取目录语法以下为读取目录的语法格式:
fs.readdir(path,callback)参数参数使用说明如下:
varfs=require("fs");console.log("查看/tmp目录");fs.readdir("/tmp/",function(err,files){if(err){returnconsole.error(err);}files.forEach(function(file){console.log(file);});});以上代码执行结果如下:
$nodefile.js查看/tmp目录input.outoutput.outtesttest.txt删除目录语法以下为删除目录的语法格式:
fs.rmdir(path,callback)参数参数使用说明如下:
varfs=require("fs");//执行前创建一个空的/tmp/test目录console.log("准备删除目录/tmp/test");fs.rmdir("/tmp/test",function(err){if(err){returnconsole.error(err);}console.log("读取/tmp目录");fs.readdir("/tmp/",function(err,files){if(err){returnconsole.error(err);}files.forEach(function(file){console.log(file);});});});