fs模块是Node.js官方提供用来操作文件的模块,属于核心模块,提供了一些列的方法和属性,用来满足用户的操作需求;
引入fs模块
const fs = require('fs');
fs.readFile() 读取
读取指定的内容,fs.readFile(path[,options],callback) '[ ]'为可选参数 ;path是文件路径,options是用什么编码格式读取文件,callback是读取完成之后通过回调的形式拿到读取失败err和成功dataStr的结果;
// read.txt
被读取的文件
// readFile.js文件
const fs = require('fs');
fs.readFile('./read.txt','utf8',function(err,dataStr){
console.log(err); // 读取成功err的值为 null,
console.log(dataStr); // 读取dataStr失败,dataStr为undefined
})
文件是否读取成功?
const fs = require('fs');
fs.readFile('./read.txt','utf8',function(err,dataStr){
if(err){
return console.log('读取失败:'+err.message);
}
console.log('读取的内容:'+dataStr);
})
将读取的文件名称改掉,使其读取错误结果:read.txt => reads.txt ,没有该文件;
fs.writeFile() 写入
写入指定内容,fs.writeFile(file,data[,options],callback),file表示文件的存放路径,data是写入的内容,options是编码格式(默utf8),callback完成后回调函数;
const fs = require('fs');
// 往read.txt内写入
fs.writeFile('./read.txt','写入syan123',function(err){
console.log(err); // 写入成功err的值为null
})
判断是否写入成功?
const fs = require('fs');
// 往read.txt内写入
fs.writeFile('./read.txt','写入syan123',function(err){
if(err){
console.log("写入失败:"+err.message);
}
console.log("写入成功!")
})
fs.writeFile 注意
fs.writeFile() 方法只能用来创建文件,不能创建路径;
重复调用fs.writeFile() 写入同一个文件,新写入的内容会覆盖掉之前的内容;
文件路径问题
使用fs.readFile()或者fs.writeFile()中的path路径都是相对路径 ' ./read.txt ',这种方式会出现路径错误的问题:在运行node xx.js 文件时,会在当前所处目录去动态拼接完成路径;
如以下这样运行的话,路径的拼接就会出现错误,以致于读取失败;
这样一来可以通过完整的路径来进行文件的读取,就能够避免掉出现路径拼接出现错误的文体,但带来的是文件的【移植性】会变得很差,不利于维护,如下:
const fs = require('fs');
fs.readFile('C:\\Users\\Administrator\\Desktop\\node\\Node\\fs模块\\read.txt','utf8',function(err,dataStr){
if(err){
return console.log('读取失败:'+err.message);
}
console.log('读取的内容:'+dataStr);
})
既然动态的拼接会出现问题,使用完成路径导致文件移植性和维护性差点问题,可以通过以下这种方式 __dirname 表示当前文件所处的目录文件再动态的拼接路径;
__dirname 解决路径问题
const fs = require('fs');
fs.readFile( __dirname + '/read.txt','utf8',function(err,dataStr){
if(err){
return console.log('读取失败:'+err.message);
}
console.log('读取的内容:'+dataStr);
console.log('读取目录路径:'+ __dirname);
})
文件的打开模式有以下几种:
'a' | 打开文件用于追加。若文件不存在,则创建该文件。 |
'a+' | 打开文件用于读取和追加。若文件不存在,则创建该文件。 |
'as+' | 打开文件用于读取和追加(在同步模式中),若文件不存在,则创建该文件。 |
'r' | 打开文件用于读取。若文件不存在,则会发生异常。 |
'rs+' | 打开文件用于读取和写入(在同步模式中),指示操作系统绕过本地的文件系统缓存。 |
'w+' | 打开文件用于读取和写入。如果文件不存在则创建文件,若文件存在则截断文件。 |
fs.openSync() 打开文件 —— 同步
同步打开文件,fs.openSync(path,[flags,mode]),flag是文件系统flag支持,默认是'r';
// openSync.js文件
const fs = require('fs');
const fd = fs.openSync( __dirname + '/read.txt','r');
console.log(fd); // fd 文件描述符
返回值为:<number>,表示文件描述符的整数;
fs.open() 打开文件 —— 异步
异步打开文件,fs.open(path,[flags,mode],callback),有callback回调;
// open.js文件
const fs = require('fs');
fs.open(__dirname+'/reads.txt','r',function(err,fd){
if(err){
return console.log('文件打开失败!');
}
// fd是文件描述符,文件标识
console.log(fd);
})
同步和异步打开文件都有返回值<number>表示文件描述符的整数,区别在于异步打开文件有两个回调函数(err,fd),err是异常的错误信息,fd是打开文件后的标识;对应的有同步/异步的打开文件,就有同步和异步的关闭文件;
fs.closeSync() 关闭文件 —— 同步
同步关闭文件,fs.closeSync(fd),fd为文件关闭的标识;通过fs.openSync() 同步打开文件能获得打开文件的标识返回值 <number> ,同步关闭文件可以通过fs.closeSync(fd) 根据打开文件的标识来关闭;
fs.close() 关闭文件 —— 异步
异步关闭文件,fs.close(fd,callback),异步关闭会有callback回调,内部有1和异常参数err;
// close.js文件
const fs = require('fs');
// 打开文件后关闭
fs.open( __dirname + '/read.txt','r',function(err,fd){
if(err){
return console.log('文件打开失败!');
}
fs.close(fd,function(fd,err){
if(err) throw err;
console.log('文件正常关闭');
})
})
fs.appendFile() 文件追加
向文件追加内容,fs.appendFile(file,data[,options],callback) ,data是要追加的文件内容,可以是String(字符串)或者buffer(流)对象;现在就往read.txt文件内去追加内容:
// appenFile.js 文件
const fs = require('fs');
const content = '追加的数据内容:syan123';
fs.appendFile(__dirname+'/read.txt',content,function(err){
if(err){
return console.log(err);
}
console.log('append成功!')
})
fs.unlinkSync() 删除文件 —— 同步
同步方式删除,fs.unlinkSync(path),返回值是undefined;
// unlinkSync.js文件 —— 观察read.txt文件
const fs = require('fs');
const rs = fs.unlinkSync( __dirname + '/read.txt');
console.log(rs); // undefined
fs.unlink() 删除文件 —— 异步
异步方式删除,fs.unlink(path,callback);
// unlink.js文件 —— 观察read.txt文件
const fs = require('fs');
fs.unlink(__dirname + '/read.txt',function(err){
if(err){
return console.log('unlink失败');
}
console.log('unlink成功');
})
目录操作
fs.mkdir() 创建目录
创建目录操作,fs.mkdir(path,[mode],callback);mode设置目录权限,默认为0777;
// mkdir.js文件 —— 观察是否出现demo
const fs = require('fs');
fs.mkdir( __dirname + '/demo',function(err){
if(err){
return console.log("创建失败!");
}
console.log("创建成功!");
})
fs.readdir() 读取目录
读取目录操作,fs.readdir(path[,options],callback),异步读取目录内容,options是可以是编码也可以是encoding,encoding为'buffer',返回文件名作为buffer对象传入;callback有两个参数(err,files),err是异常出错的信息,files是目录中文件名称的数组;先在demo文件下面定义两个文件:fileOne.js 和 fileTwo.js ,通过回调中的files获取目录下的文件名称数组;
// readdir.js文件
const fs = require('fs');
fs.readdir(__dirname+'/demo',function(err,files){
if(err){
return console.log(err);
}
console.log(files);
})
打印出在demo目录下的文件名称数组 [ 'fileOne.js' ,'fileTwo.js' ] ;
fs.stat() 查看目录
查看目录及文件信息,fs.stat(path,callback),可以通过callback中的参数stats访问文件属性
// stat.js 文件
const fs = require('fs');
fs.stat(__dirname + '/demo',function(err,stats){
if(err) throw err;
console.log(stats);
})
检查目录是否存在
异步检查目录,fs.exists()已经是被废弃掉了的API,使用同步的方式检查,fs.existsSync();
// existsSync.js 文件
// 检查目录是否存在
const fs = require('fs');
const rs = fs.existsSync(__dirname + '/demo')
console.log(rs);
fs.rmdir() 删除目录
删除目录,前提是目录必须是空的,不能包含任何文件;fs.rmdir(path,callback);将demo目录文件删除掉,然后将demo目录删除掉;
// rmdir.js文件
const fs = require('fs');
fs.rmdir(__dirname + '/demo',function(err){
if(err){
return console.log("删除demo目录失败!");
}
console.log("删除成功!");
})
删除有文件的目录
删除含有文件的目录,通过先删除文件可以fs.unlink(),再通过fs.rmdir()可以删除空目录即可;下面来删除demo目录,demo目录下还有两个文件fileOne.js和fileTwo.js;
// demo.js文件
const fs = require('fs');
// 读取目录信息
fs.readdir(__dirname + '/demo',function(err,files){
if(err) throw err;
console.log("files文件:",files);
// 删除文件
files.forEach(function(file){
console.log(file);
fs.unlink(__dirname+'/demo/'+file,function(err){
console.log(__dirname+'/demo'+file);
if(err){
return console.log("删除文件失败!");
}
console.log("删除文件成功!");
})
})
// 删除目录
fs.rmdir(__dirname+'/demo',function(err){
if(err){
return console.log("目录删除失败!");
}
console.log("目录删除成功!");
})
})
以上就是关于Node.js中的fs文件操作模块的一些基础内容,当然关于fs模块的内容不止这些,还有其他结合buffer的一些内容,比如还有一些读写fs.read() 和fs.write() 等的一些方法!在后续的内容相继来讲!