node.js — 文件系统(File System)
基本概念
- 学习fs木块的API
- 使用fs模块前,需要引入cost fd=require(‘fs’);
特点
- 提供同步异步两种选择
- 同步导致堵塞
- 异步操作完成通过回调返回结果
同步与异步
同步写入-- fs.writeFileSync()
let fs = require('fs')
//同步打开文件
let fd = fs.openSync('text1','w')
//打印出标识id
console.log(fd);
//写入内容
let str="小廖,你好"
fs.writeSync(fd,str)
//退出文件
fs.closeSync(fd)
同步相当于 点汉堡 =》制作汉堡=》 汉堡制作好了之后,你拿走了 => 下一位用户继续点汉堡
整个事件完成之后再轮到下一个开始
异步写入 – fs.writeFile()
异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
var fs = require("fs");
// 异步读取
fs.readFile('input.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("异步读取: " + data.toString());
});
【异步方法的优点:比同步方法的性能更高,速度更快,而且没用堵塞】
异步:点汉堡 =》旁白下一位等待 =>下一位继续点汉堡 =》 旁边等待,汉堡好了之后,会自动叫你领取
打开文件
异步模式下打开文件的语法:
fs.open(path, flags[, mode], callback)
参数:
- path - 文件的路径。
- flags - 文件打开的行为。具体值详见下文。
- mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)。
- callback - 回调函数,带有两个参数如:callback(err, fd)。
flags 参数可以是以下值:
Flag | 描述 |
---|---|
r | 以读取模式打开文件。如果文件不存在抛出异常。 |
r+ | 以读写模式打开文件。如果文件不存在抛出异常。 |
rs | 以同步的方式读取文件。 |
rs+ | 以同步的方式读取和写入文件。 |
w | 以写入模式打开文件,如果文件不存在则创建。 |
wx | 类似 ‘w’,但是如果文件路径存在,则文件写入失败。 |
w+ | 以读写模式打开文件,如果文件不存在则创建。 |
wx+ | 类似 ‘w+’, 但是如果文件路径存在,则文件读写失败。 |
a | 以追加模式打开文件,如果文件不存在则创建。 |
ax | 类似 ‘a’, 但是如果文件路径存在,则文件追加失败。 |
a+ | 以读取追加模式打开文件,如果文件不存在则创建。 |
ax+ | 类似 ‘a+’, 但是如果文件路径存在,则文件读取追加失败。 |
文件写入流
写入语法
fs.writeFile(file, data[, options], callback)
参数说明
- file - 文件名或文件描述符。
- data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(缓冲) 对象。
- options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 ‘w’
- callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。
实例
//文件写入流
let fs = require('fs')
//创建写入流
let ws = fs.createWriteStream('text3.txt');
//监听通道打开
ws.once('open',()=>{
console.log("通道打开")
ws.write("你好,我是你爹1")
ws.write("你好,我是你爹2")
ws.write("你好,我是你爹3")
//写入结束
ws.end()
})
//监听通道关闭
ws.once('close',()=>{
console.log('通道关闭')
})
文件读取流
异步模式下读取文件的语法
fs.read(fd, buffer, offset, length, position, callback)
参数说明
- fd - 通过 fs.open() 方法返回的文件描述符。
- buffer - 数据写入的缓冲区。
- offset - 缓冲区写入的写入偏移量。
- length - 要从文件中读取的字节数。
- position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
- callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。
实例
//文件读取
let fs = require('fs')
fs.readFile('text2.txt',(err,data)=>{
if(!err){
//这里如果不加toString()则会以二进制形式打印输出
console.log(data.toString())
}else{
console.log('err:',err)
}
})
console.log('读写完成')
删除文件
语法
fs.unlink(path,callback)
参数说明
- path - 文件路径。
- callback - 回调函数,没有参数。
实例
let fs = require('fs')
//删除文件
fs.unlink('text2.txt',(err)=>{
if (err) {
console.log(err)
}else{
console.log('删除成功')
}
})
读取目录下的所有文件
语法
fs.readdir(path,callback)
参数说明
- path - 文件路径。
- callback - 回调函数,回调函数带有两个参数err, files,err 为错误信息,files 为 目录下的文件数组列表。
实例
fs.readdir('./',(err,files)=>{
if(err){
console.log(err)
}else{
console.log(files)
}
})
输出是一个数组
文件与文件夹的创建与删除
创建文件
语法
fs.mkdir(path,callback)
- path - 文件路径。
- callback - 回调函数,回调函数带有两个参数err, files,err 为错误信息,files 为 目录下的文件数组列表。
实例
//创建文件夹
fs.mkdir('./img',(err)=>{
if(err){
console.log(err)
}else{
console.log("创建成功")
}
})
删除文件
删除文件夹
如果该文件夹下还有其他文件,运行则会显示报错无法删除
这样只能删除空的文件夹,而不能删除内容
fs.rmdir('./img',(err)=>{
if(err){
console.log(err)
}else{
console.log("删除成功")
}
})
删除文件夹+文件
function delDir(dirPath){
var filesArr = fs.readdirSync(dirPath)
for(var i in filesArr){
//定义一个文件的路径
var filePath = dirPath + '/' + filesArr[i];
//读取文件信息
var stat = fs.statSync(filePath)
//判断是文件还是目录
if(stat.isFile()){
fs.unlinkSync(filePath)
}else if(stat.isDirectory()){
//如果是目录的话就是递归删除目录文件
//递归调用自己
delDir(filePath)
}
}
//删除完文件之后,就删除本身空目录
fs.rmdirSync(dirPath)
}
//调用函数
delDir('./img')