3.Node.js FS模块(File system)

2.2FS模块(File system)

2.2.1创建文件对象
js 复制代码
let fs=require('fs')
2.2.2写入文件:writeFile函数
js 复制代码
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:写入回调

示例:

js 复制代码
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.

js 复制代码
let fs=require('fs')

fs.writeFile('./file.txt','I love sally',err=>{
	if (err){
		console.log(err)
	}else{
		console.log('写入成功')
	}
	
})
console.log('Js代码执行完毕')

输出:

js 复制代码
//这里可以看到,所有Js代码执行完毕后才会执行writeFile
Js代码执行完毕
写入成功

.同步写入文件函数writeFileSync()

js 复制代码
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 复制代码
#当Js执行到writeFileSync函数里,会等待文件写入完成以后再执行后面的代码
try{
fs.writeFileSync('./座右铭.txt', '三人行,必有我师焉。');
}catch(e){
console.log(e);
}

console.log('Js代码执行完毕')
2.2.4异步追加写入(appendFile函数)
js 复制代码
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:写入回调	

示例:

js 复制代码
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代码执行完毕')

输出:

js 复制代码
//appendFile函数也是异步函数
Js代码执行完毕
写入成功
2.2.5同步追加写入appendFileSync()函数
js 复制代码
fs.appendFileSync(file,data,options)
	// file:文件名;
	// data:待写入的数据;
	// option:选项(可选); {encoding:'',mode:'',flag:''}
		//encoding(string)可选值,默认 'utf8′,当data使buffer时,该值应该为 ignored。
 		//mode(Number) 文件读写权限,默认值 438
        //flag(String)默认值 'w':重新写入,会把文件原内容删除,'a'追加写入
	

示例:

js 复制代码
try{
	fs.appendFileSync('./file.txt','I love me too')
	}catch(e){
		console.log(e)
	}
2.2.6流式写入createWriteStream()
js 复制代码
createWriteStream(file,options)
/**
file:文件名;
option:选项(可选): {encoding:'',mode:'',flag:''}
		encoding(string)可选值,默认 'utf8′,当data使buffer时,该值应该为 ignored。
 		mode(Number) 文件读写权限,默认值 438
        flag(String)默认值 'w':重新写入,会把文件原内容删除,'a'追加写入
**/

示例:

js 复制代码
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()函数
js 复制代码
fs.readFile(path,[options],callback)
//参数解读
//参数1:必选参数,字符串,表示文件的路径
//参数2:可选参数,表示以什么编码格式来读取文件
//参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果

示例:

js 复制代码
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()函数
js 复制代码
fs.readFile(path,[options])
//参数解读
//参数1:必选参数,字符串,表示文件的路径
//参数2:可选参数,表示以什么编码格式来读取文件

示例:

js 复制代码
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()函数

示例

js 复制代码
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方式

js 复制代码
//复制1.mp4,新文件为2.mp4
let fs=require('fs')

let data=fs.readFileSync('./1.mp4')

fs.writeFileSync('./2.mp4',data)

2)流式方法

js 复制代码
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重命名和移动文件
js 复制代码
//异步方式移动文件
rename(oldPath,newPath,callback)
//同步方式移动文件
renameSync(oldPath,newPath)

示例:

js 复制代码
//将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方法

js 复制代码
//异步方式移动文件
unlink(file,callback)
//同步方式移动文件
unlinkSync(file)

示例:

js 复制代码
//删除当前目录下的2.mp4文件
let fs=require('fs')

fs.unlink('./2.mp4',err=>{
	if (err){
		console.log(err)
	}else{
		console.log('删除成功')
	}
}

)

2)rm方法

js 复制代码
//异步方式移动文件
rm(file,callback)
//同步方式移动文件
rmSync(file)

示例:

js 复制代码
//删除当前目录下的2.mp4文件
let fs=require('fs')

fs.rm('./2.mp4',err=>{
	if (err){
		console.log(err)
	}else{
		console.log('删除成功')
	}
}

)
2.2.13创建文件夹
js 复制代码
//异步方式创建文件夹
fs.mkdir(path[,options],callback)
//同步方式创建文件夹
fs.mkdirSync(path[,options])

示例1(创建单个文件夹):

js 复制代码
//在当前文件夹下创建一个名为mydir的文件夹
let fs=require('fs')
fs.mkdir('./mydir',err=>{
	if (err){
		console.log(err)
	}else{
		console.log('创建目录成功')
	}
})

示例2(递归创建文件夹)

js 复制代码
//在当前文件夹下创建文件夹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读取文件夹
js 复制代码
fs.readdir(path,callback)

示例:

js 复制代码
//列出当前文件夹中的内容(列表形式)
let fs=require('fs')
fs.readdir('./',(err,data)=>{
	if(err){
		console.log(err)
	}else{
		console.log(data)
	}
})

输出:

js 复制代码
[ 'a', 'file.js', 'file.txt', 'hello.js', 'mydir', '座右铭.txt' ]
2.2.15删除文件夹
复制代码
fs.rm(path,options,callback)

示例:

js 复制代码
//删除当前文件夹下的a文件夹
let fs=require('fs')
//{recursive:true}代表递归删除,会同时删除文件夹中的内容。如果不加这个选项,则只能删除空文件夹
fs.rm('./a',{recursive:true},err=>{
	if (err){
		console.log(err)
	}else{
		console.log('删除成功')
	}
})
2.2.16查看资源状态
js 复制代码
fs.stat(path,callback)

示例:

js 复制代码
//查看当前目录下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())
	}
})

输出:

js 复制代码
资源信息: 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
相关推荐
鹿鹿鹿鹿isNotDefined2 分钟前
Pixelium Design:Vue3 的像素风 UI 组件库
前端·javascript·vue.js
运维行者2 分钟前
知乎崩了?立即把网站监控起来!
前端·javascript·后端
stayong21 分钟前
市面主流跨端开发框架对比
前端
庞囧34 分钟前
大白话讲 React 原理:Scheduler 任务调度器
前端
东华帝君1 小时前
react 虚拟滚动列表的实现 —— 动态高度
前端
CptW1 小时前
手撕 Promise 一文搞定
前端·面试
温宇飞1 小时前
Web 异步编程
前端
腹黑天蝎座1 小时前
浅谈React19的破坏性更新
前端·react.js
东华帝君1 小时前
react组件常见的性能优化
前端
第七种黄昏1 小时前
【前端高频面试题】深入浏览器渲染原理:从输入 URL 到页面绘制的完整流程解析
前端·面试·职场和发展