Bootstrap

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

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
;