2.2FS模块(File system)
2.2.1创建文件对象
let fs=require('fs')
2.2.2写入文件:writeFile函数
fs.writeFile(file,data,options,callback)
// file:文件名;
// data:待写入的数据;
// option:选项(可选):{encoding:'',mode:'',flag:''}
//encoding(string)可选值,默认 ‘utf8′,当data使buffer时,该值应该为 ignored。
//mode(Number) 文件读写权限,默认值 438
//flag(String)默认值 ‘w':重新写入,会把文件原内容删除,‘a'追加写入
// callback:写入回调
示例:
fs.writeFile('./file.txt','I love sally',err=>{
//如果写入失败,err值是一个错误对象,如果写入成功,err为null
//文件如果不存在,会创建文件
if (err){
console.log(err)
}else{
console.log('写入成功')
}
})
2.2.3FS模块的同步和异步
writeFile函数是一个异步函数,在执行到该函数里,会将该函数压入一个新的进程,等整个js代码执行完毕后,再执行writeFile.
let fs=require('fs')
fs.writeFile('./file.txt','I love sally',err=>{
if (err){
console.log(err)
}else{
console.log('写入成功')
}
})
console.log('Js代码执行完毕')
输出:
//这里可以看到,所有Js代码执行完毕后才会执行writeFile
Js代码执行完毕
写入成功
.同步写入文件函数writeFileSync()
fs.writeFile(file,data,options)
// file:文件名;
// data:待写入的数据;
// option:选项(可选); {encoding:'',mode:'',flag:''}
//encoding(string)可选值,默认 ‘utf8′,当data使buffer时,该值应该为 ignored。
//mode(Number) 文件读写权限,默认值 438
//flag(String)默认值 ‘w':重新写入,会把文件原内容删除,‘a'追加写入
示例:
#当Js执行到writeFileSync函数里,会等待文件写入完成以后再执行后面的代码
try{
fs.writeFileSync('./座右铭.txt', '三人行,必有我师焉。');
}catch(e){
console.log(e);
}
console.log('Js代码执行完毕')
2.2.4异步追加写入(appendFile函数)
fs.appendFile(file,data,options,callback)
// file:文件名;
// data:待写入的数据;
// option:选项(可选); {encoding:'',mode:'',flag:''}
//encoding(string)可选值,默认 ‘utf8′,当data使buffer时,该值应该为 ignored。
//mode(Number) 文件读写权限,默认值 438
//flag(String)默认值 ‘w':重新写入,会把文件原内容删除,‘a'追加写入
// callback:写入回调
示例:
let fs=require('fs')
//\r\n代表换行
fs.appendFile('./file.txt','\r\nI love ying too',err=>{
if (err){
console.log(err)
}else{
console.log('写入成功')
}
})
console.log('Js代码执行完毕')
输出:
//appendFile函数也是异步函数
Js代码执行完毕
写入成功
2.2.5同步追加写入appendFileSync()函数
fs.appendFileSync(file,data,options)
// file:文件名;
// data:待写入的数据;
// option:选项(可选); {encoding:'',mode:'',flag:''}
//encoding(string)可选值,默认 ‘utf8′,当data使buffer时,该值应该为 ignored。
//mode(Number) 文件读写权限,默认值 438
//flag(String)默认值 ‘w':重新写入,会把文件原内容删除,‘a'追加写入
示例:
try{
fs.appendFileSync('./file.txt','I love me too')
}catch(e){
console.log(e)
}
2.2.6流式写入createWriteStream()
createWriteStream(file,options)
/**
file:文件名;
option:选项(可选): {encoding:'',mode:'',flag:''}
encoding(string)可选值,默认 ‘utf8′,当data使buffer时,该值应该为 ignored。
mode(Number) 文件读写权限,默认值 438
flag(String)默认值 ‘w':重新写入,会把文件原内容删除,‘a'追加写入
**/
示例:
let fs=require('fs')
//创建写入流对象,flags:'a'代表是追加写入
let ws=fs.createWriteStream('./file.txt',{flags:'a'})
ws.write('I love 1\r\n');
ws.write('I love 2\r\n');
ws.write('I love 3\r\n');
ws.write('I love 4\r\n');
//关闭ws,也可以不写
ws.close()
2.2.7异步读取文件readFile()函数
fs.readFile(path,[options],callback)
//参数解读
//参数1:必选参数,字符串,表示文件的路径
//参数2:可选参数,表示以什么编码格式来读取文件
//参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果
示例:
let fs=require('fs')
//err为错误信息,没有错误的时候为null,data为文件内容(Buffer)
fs.readFile('./file.txt',(err,data)=>{
if(err){
console.log(err)
}else{
//将Buffer转换成字符串
console.log('读取成功',data.toString())
}
})
2.2.8同步读取文件readFileSync()函数
fs.readFile(path,[options])
//参数解读
//参数1:必选参数,字符串,表示文件的路径
//参数2:可选参数,表示以什么编码格式来读取文件
示例:
let fs=require('fs')
try{
//data为读取到的文件内容(Buffer)
var data=fs.readFileSync('./file.txt')
}catch(e){
console.log(e)
}
//将Buffer转换成字符串
console.log(data.toString())
2.2.9流式读取createReadStream()函数
示例
let fs=require('fs')
//获取流式读取对象
let rs=fs.createReadStream('./1.mp4')
rs.on('data',chunk=>{
//打印每次读取的长度(65535字节)
console.log(chunk.length)
})
rs.on('end',()=>{
//读取结束以后执行的代码
console.log('读取完毕')
})
2.2.10复制文件
1)readFileSync方式
//复制1.mp4,新文件为2.mp4
let fs=require('fs')
let data=fs.readFileSync('./1.mp4')
fs.writeFileSync('./2.mp4',data)
2)流式方法
let fs=require('fs')
let rs =fs.createReadStream('./1.mp4')
let ws=fs.createWriteStream('./3.mp4')
rs.on('data',(chunk)=>{
//使用流式读取,读取一部分,再用流式写入,写入一部分
ws.write(chunk)
})
2.2.11重命名和移动文件
//异步方式移动文件
rename(oldPath,newPath,callback)
//同步方式移动文件
renameSync(oldPath,newPath)
示例:
//将1.mp4移动到当路径下的2.mp4(路径不变的话,就相当于是重命名)
let fs=require('fs')
fs.rename('./1.mp4','./2.mp4',err=>{
if (err){
console.log(err)
}else{
console.log('移动文件成功')
}
})
2.2.12删除文件
1)unlink方法
//异步方式移动文件
unlink(file,callback)
//同步方式移动文件
unlinkSync(file)
示例:
//删除当前目录下的2.mp4文件
let fs=require('fs')
fs.unlink('./2.mp4',err=>{
if (err){
console.log(err)
}else{
console.log('删除成功')
}
}
)
2)rm方法
//异步方式移动文件
rm(file,callback)
//同步方式移动文件
rmSync(file)
示例:
//删除当前目录下的2.mp4文件
let fs=require('fs')
fs.rm('./2.mp4',err=>{
if (err){
console.log(err)
}else{
console.log('删除成功')
}
}
)
2.2.13创建文件夹
//异步方式创建文件夹
fs.mkdir(path[,options],callback)
//同步方式创建文件夹
fs.mkdirSync(path[,options])
示例1(创建单个文件夹):
//在当前文件夹下创建一个名为mydir的文件夹
let fs=require('fs')
fs.mkdir('./mydir',err=>{
if (err){
console.log(err)
}else{
console.log('创建目录成功')
}
})
示例2(递归创建文件夹)
//在当前文件夹下创建文件夹a,在a文件夹下创建文件夹b,在b文件夹下创建文件夹c
let fs=require('fs')
//{recursive:true}允许递归创建文件夹
fs.mkdir('./a/b/c',{recursive:true},err=>{
if (err){
console.log(err)
}else{
console.log('创建目录成功')
}
})
2.2.14读取文件夹
fs.readdir(path,callback)
示例:
//列出当前文件夹中的内容(列表形式)
let fs=require('fs')
fs.readdir('./',(err,data)=>{
if(err){
console.log(err)
}else{
console.log(data)
}
})
输出:
[ 'a', 'file.js', 'file.txt', 'hello.js', 'mydir', '座右铭.txt' ]
2.2.15删除文件夹
fs.rm(path,options,callback)
示例:
//删除当前文件夹下的a文件夹
let fs=require('fs')
//{recursive:true}代表递归删除,会同时删除文件夹中的内容。如果不加这个选项,则只能删除空文件夹
fs.rm('./a',{recursive:true},err=>{
if (err){
console.log(err)
}else{
console.log('删除成功')
}
})
2.2.16查看资源状态
fs.stat(path,callback)
示例:
//查看当前目录下file.txt的状态
let fs=require('fs')
fs.stat('./file.txt',(err,data)=>{
if (err){
console.log(err)
}else{
console.log('资源信息:',data)
console.log('是否为文件',data.isFile())
console.log('是否为文件夹',data.isDirectory())
}
})
输出:
资源信息: Stats {
dev: 3270058782,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: 4096,
ino: 281474976815110,
size: 80,
blocks: 0,
atimeMs: 1728814074334.3784,
mtimeMs: 1728814074334.3784,
ctimeMs: 1728814074334.3784,
birthtimeMs: 1728811378130.5647,
atime: 2024-10-13T10:07:54.334Z,
mtime: 2024-10-13T10:07:54.334Z,
ctime: 2024-10-13T10:07:54.334Z,
birthtime: 2024-10-13T09:22:58.131Z
}
是否为文件 true
是否为文件夹 false