node.js中fs文件系统模块的使用方法实例详解
本文实例讲述了node.js中fs文件系统模块的使用方法。分享给大家供大家参考,具体如下:
node.js中为我们提供了fs文件系统模块,实现对文件或目录的创建,修改和删除等操作。
fs模块中,所有的方法分为同步和异步两种实现。
有sync后缀的方法为同步方法,没有sync后缀的方法为异步方法。
一、文件的整个读取
constfs=require('fs');
//参数一表示读取的文件
//参数二表示读取的配置,{encoding:'null',flag:'r'}
//encoding表示编码方式
//flag表示文件系统标志
//如果没有指定参数二中的encoding,则data返回的是一个Buffer
fs.readFile('./1.txt',function(err,data){
console.log(data);
});
//如果指定了,则data返回的是解析后的字符串
fs.readFile('./1.txt',{'encoding':'utf8','flag':'r'},function(err,data){
console.log(data);
});
或同步读取:
constfs=require('fs');
letdata=fs.readFileSync('./1.txt');
console.log(data);
letdata2=fs.readFileSync('./1.txt',{'encoding':'utf8'});
console.log(data2);
二、往文件写入数据
constfs=require('fs');
//参数一表示需要写入的文件
//参数二表示写入的数据
//参数三表示写入配置{encoding:'utf8',mode:'0o666',flag:'w'}
//encoding表示文件编码
//mode表示文件权限
//flag表示表示文件系统标志
fs.writeFile('./1.txt','数据',{'mode':0o666,'flag':'w'},function(err){
console.log(err);
});
//注意如果文件已存在,默认会覆盖写入
fs.writeFile('./1.txt','你好',function(err){
console.log(err);
});
//如果想追加写入,将flag设置为'a'就可以了。
fs.writeFile('./1.txt','你好',{'flag':'a'},function(err){
console.log(err);
});
注意,writeFile()默认会以覆盖的方式写入数据。
或者同步写入数据:
constfs=require('fs');
fs.writeFileSync('./1.txt','数据');
关于mode文件权限的说明:
在linux中文件的权限会为3种,4-表示可读,2-表示可写,1-表示可执行。它们之间的相互组合形成不同权限。
对于文件,有三个权限分配,1:文件所有者,2:文件所属组,3:其他用户。
关于flag文件系统标志的说明:
r+与w+区别,文件不存在时,r+不会创建文件,而w+会创建。如果文件存在r+不会清空文件,而w+会清空文件。
三、往文件中追加数据
constfs=require('fs');
fs.appendFile('./1.txt','数据',function(err){
console.log(err);
});
fs.appendFileSync('./1.txt','同步追加');
四、拷贝文件
constfs=require('fs');
//参数一表示源文件
//参数二表示目标文件
//参数三表示拷贝操作的修饰符,默认0
//参数四表示回调函数
fs.copyFile('./1.txt','./2.txt',function(err){
console.log(err);
});
//同步拷贝文件
fs.copyFileSync('./1.txt','./3.txt');
五、打开文件,读取文件,写入文件
constfs=require('fs');
//参数一表示文件路径
//参数二表示文件系统标志
//参数三表示文件权限
//参数四表示回调函数,err表示错误,fd表示文件描述符,是一个整型
fs.open('./1.txt','r+',0o666,function(err,fd){
//创建一个3字节的Buffer,用来接收数据
letrbuf=Buffer.alloc(3);
//参数一表示文件描述符
//参数二表示接收数据的Buffer
//参数三表示往Buffer中写入的偏移量
//参数四表示读取的字节数
//参数五表示从文件中读取的位置,如果为null,则是文件的当前位置读取
//参数六表示回调函数,err表示错误,bytesRead表示实际读取的字节,buffer表示接收数据的Buffer
fs.read(fd,rbuf,0,3,0,function(err,bytesRead,buffer){
console.log(rbuf.toString());
console.log(bytesRead);
});
letwbuf=Buffer.from('中国');
//参数一表示文件描述符
//参数二表示写入数据的Buffer
//参数三表示往Buffer中读取的偏移量
//参数四表示写入的字节数
//参数五表示从文件中写入的位置,如果不等于数字,则从文件的当前位置写入
//参数六表示回调函数,err表示错误,written表示实际写入的字节数,buffer表示写入数据的Buffer
fs.write(fd,wbuf,0,3,fs.stat,function(err,written,buffer){
console.log(written);
});
});
六、同步磁盘缓存,把缓冲区数据刷新到文件中。
constfs=require('fs');
fs.open('./1.txt','w+',0o666,function(err,fd){
letdata=Buffer.from('数据\n');
lettask=[];
//我们往文件中循环写入数据
for(ix=0;ix<1000;ix++){
task.push(function(){
returnnewPromise((resolve,reject)=>{
fs.write(fd,data,0,data.length,null,function(err,written,buffer){
if(err){
reject(err);
}else{
resolve(written);
}
});
});
});
}
Promise.all(task.map(fn=>fn())).then(value=>{
console.log(value);
},reason=>{
console.log(reason);
});
//当们写完数据后,一般会强制刷新缓冲区,让数据写入到文件里,然后关闭文件。
//因为系统为了效率,我们写入的数据通常会放到一个缓冲区中,当缓冲区满了后,系统就一次把数据写到文件。
fs.fsync(fd,function(err){
console.log(err);
//关闭文件
fs.close(fd,function(err){
console.log(err);
})
});
});
七、创建目录
constfs=require('fs');
//创建目录,默认情况下不支持递归创建目录
fs.mkdir('./a',function(err){
console.log(err);
});
//通过设置参数二中的recursive为true,则可以递归创建目录
fs.mkdir('./a/b/c',{'recursive':true},function(err){
console.log(err);
});
八、删除目录
constfs=require('fs');
//rmdir无法删除非空目录
fs.rmdir('./a',function(err){
console.log(err);
});
九、测试文件或目录是否存在,是否可读,是否可写
constfs=require('fs');
letpath='./a';
//判断是否存在
fs.access(path,fs.constants.F_OK,function(err){
console.log(err?'不存在':'存在');
});
//判断是否可读
fs.access(path,fs.constants.R_OK,function(err){
console.log(err?'不可读':'可读');
});
//判断是否可写
fs.access(path,fs.constants.W_OK,function(err){
console.log(err?'不可写':'可写');
});
十、读取目录下的所有文件
constfs=require('fs');
constpath=require('path');
//读取目录下所有文件
fs.readdir('./a',function(err,files){
console.log(files);
});
//递归的读取一个目录所有文件
functionreadDir(dir){
fs.stat(dir,function(err,stats){
if(stats.isDirectory()){
console.log(dir);
fs.readdir(dir,function(err,files){
files.map(value=>{
letcur=path.join(dir,value);
fs.stat(cur,function(err,stats){
if(stats.isDirectory()){
readDir(cur);
}else{
console.log(cur);
}
});
});
});
}else{
console.log(dir);
}
});
}
readDir('./node_modules');
十一、查看文件或目录的详细信息
constfs=require('fs');
//获取目录详细信息
fs.stat('./a',function(err,stats){
console.log(stats);
});
//获取文件详细信息
fs.stat('./1.txt',function(err,stats){
console.log(stats);
});
- stats.size表示文件大小。
- stats.atime表示文件中的数据最后访问时间。
- stats.mtime表示文件中的内容修改最后时间。
- stats.ctime表示文件权限,拥有者,所属组,链接数发生改变时的时间。
- stats.birthtime表示文件创建时间。
十二、重命名或移动文件
constfs=require('fs');
//重命名文件
fs.rename('./1.txt','./b.txt',function(err){
console.log(err);
});
//移动文件
fs.rename('./2.txt','./a/b/c/2.txt',function(err){
console.log(err);
});
十三、删除文件
constfs=require('fs');
//删除文件
fs.unlink('./3.txt',function(err){
console.log(err);
});
十四、截取文件
constfs=require('fs');
//截取文件成3个字节
fs.truncate('./b.txt',3,function(err){
console.log(err);
});
十五、监视文件或目录的状态改变
constfs=require('fs');
//监视目录
fs.watchFile('./a',function(curr,prev){
console.log(curr);
console.log(prev);
if(curr.mtimeMs!==prev.mtimeMs){
console.log('内容发生的改变');
}
});
希望本文所述对大家node.js程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。