node.js fs模块(文件系统)
一、fs 的简介
fs(filesystem) 是 node.js 提供对服务器文件进行操作的模块,基本上是 POSIX 文件操作命令的简单包装。fs 模块中几乎对所有操作都提供异步和同步 (后缀 Sync) 两种操作方式。异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息 (error),相较于同步的方法,前者性能更高,速度更快,而且没有阻塞,所以一般都优先使用异步的方法。下文中举例中均使用异步方法。
二、fs 的使用
引入
使用 fs 对进行文件操作前需要先引入该模块
const fs = require('fs');
常见操作
1. fs.stat()
stat 方法用于判断正在操作的是文件还是目录。
const fs = require('fs'); //引用fs,后面例子默认引用
//判断path是文件还是路径
let path='hello.js';
fs.stat(path, (error, stats) =>{
if(error){
console.log(error)
} else{
console.log(stats)
console.log(`文件:${stats.isFile()}`)
console.log(`目录:${stats.isDirectory()}`)
}
})
stat 接受两个参数:
- 第一个是目录名
- 第二个是回调函数,产生一个对象 stats ,该对象包含了该文件或目录的具体信息,例子中分别使用 isFile 和 isDirectory 来判断当前操作的是文件还是目录,取值为 true 和 false。
2. fs.mkdir()
mkdir 方法用于新建目录。
fs.mkdir('hello',0777, (error) => {
if(error){
console.log(error)
} else {
console.log('成功创建目录:hello')
}
})
mkdir 接受三个参数:
- 第一个是目录名
- 第二个是目录的读写权限值,默认取0777,表示所有人可读,可写,可执行
- 第三个是回调函数。
3. fs.writeFile()
writeFile 方法用于写入文件。
fs.writeFile('hello/index.js', 'hello,index', (error) => {
if(error) {
console.log(error)
} else {
console.log('成功写入文件')
}
})
writeFile 接受三个参数:
- 第一个是目录文件名
- 第二个是文件内容
- 第三个是回调函数。
4. fs.appendFile()
appendFile 方法用于追加文件内容。
fs.appendFile('hello/index2.js', 'hello,index2', (error) => {
if(error) {
console.log(error)
} else {
console.log('成功写入文件')
}
})
如果hello目录中不存在 index2.js 文件,则创建 index2.js 文件,并写入内容,如果已经存在,则在文件中追加内容。
5. fs.readFile()
readFile 方法用于异步读取数据。
fs.readFile('hello/index.js', 'utf8',(error, data) =>{
if (error) {
console.log(error)
} else {
console.log(data)
}
})
readFile 接受三个参数:
- 第一个是文件的路径,可以是绝对路径,也可以是相对路径。
- 第二个参数可以是一个表示配置的对象,也可以是一个表示文本文件编码的字符串。默认的配置对象是{ encoding: null, flag: 'r'},即文件编码默认为 null ,读取模式默认为 r(只读)。如果第二个参数不指定编码(encoding),readFile 方法返回一个 Buffer 实例,否则返回的是一个字符串。
- 第三个是回调函数,其中 data 代表文件内容的实例。
6. fs.readdir()
readdir 方法用于读取目录,返回一个所包含的文件和子目录的数组。
fs.readdir('hello', (error, files) =>{
if (error) {
console.log(error)
} else {
var count = files.length;
var results = {};
files.forEach(function (filename) {
fs.readFile(filename, function (data) {
results[filename] = data;
count--;
if (count <= 0) {
// 对所有文件进行处理
}
});
});
}
})
readdir 接受两个参数:
- 第一个是目录。
- 第二个是回调函数,files 是一个该目录下所有的文件和子目录的数组,上述操作中读取目录并对files数组进行操作。
7. fs.rename()
rename 方法重命名目录或文件名。
fs.rename('hello/index.js', 'hello/index1.js',(error) =>{
if (error) {
console.log(error)
} else {
console.log('重命名成功')
}
})
8. fs.unlink()
unlink 方法用来删除目录。
fs.unlink('hello/index1.js', (error) =>{
if (error) {
console.log(error)
} else {
console.log('删除文件成功')
}
})
9. fs.rmdir()
rmdir 方法用来删除目录。
fs.rmdir('hello', (error) =>{
if (error) {
console.log(error)
} else {
console.log('删除目录成功')
}
})
10. fs.createReadStream()
createReadStream 方法用于打开大型的文本文件,创建一个读取操作的数据流。这里大型文本文件指的是文本文件的体积很大,读取操作的缓存装不下,只能分成几次发送,每次发送会触发一个 data 事件,发送结束会触发 end 事件。
// 创建一个读取流,读取文件 hello/index.js
const fileReadStream = fs.createReadStream('hello/index.js')
let count=0,//记录读取次数
result='';
//on监听每一次读取操作
fileReadStream.on('data', (data) => {
console.log(`${ ++count } 接收到:${data}`);
result+=data;
})
//读取完成
fileReadStream.on('end', () => {
console.log('--- 读取结束 ---');
console.log(count);
console.log(result);
})
//错误读取
fileReadStream.on('error', (error) => {
console.log(error);
})
11. fs.createWriteStream()
createWriteStream 方法创建一个写入数据流对象,该对象的 write 方法用于写入数据,end 方法用于结束写入操作。
// 创建一个写入流,写入到文件 hello/index2.js 中
const writerStream = fs.createWriteStream('hello/index2.js',{
encoding: 'utf8'
});
let text = '我是要写入的数据',//写入数据
count=0; //记录写入次数
//写入数据
writerStream.write(text);
// 每次完成写入,监听 finish 事件
writerStream.on('finish', function() {
console.log(`${++count} 写入完成`);
});
//全部写入完成
writerStream.end();
//错误写入
writerStream.on('error', function(error){
console.log(error);
});
12. createWriteStream 方法和 createReadStream 方法结合使用,可以实现拷贝大型文件。
function fileCopy(filename1, filename2, callback) {
var input = fs.createReadStream(filename1);
var output = fs.createWriteStream(filename2);
input.on('data', function(d) { output.write(d); });
input.on('error', function(err) { throw err; });
input.on('end', function() {
output.end();
if (callback) callback();
});
}
这里定义了一个 fileCopy 方法,接受三个参数:
- 第一个是需复制的文件路径。
- 第二个要复制出的文件路径。
- 第三个是复制完成后执行的回调函数。