Node.js 的 fs模块【笔记2】

Node.js 的 fs模块(fs API)

fs: file system 文件系统
fs模块可以实现与硬盘的交互。例如文件的创建、删除、重命名、移动,还有文件内容的写入、读取,以及文件夹的相关操作。

1.写入文件

方法 说明
writeFile 异步写入
writeFileSync 同步写入
appendFile /appendFileSync 追加写入
createWriteStream 流式写入
//文件名:nodejs-fs/code/1-文件写入.js
/** 文件写入需求: 
 * 新建一个文件,座右铭.txt,写入内容:三人行,则必有我师焉。
 */

// 1.导入fs模块
const fs = require('fs'); //require 是 Node.js 环境中的全局函数,用于导入模块

//2.写入文件
fs.writeFile('./座右铭.txt','三人行,则必有我师焉。', err => {
    
    
    //写入失败时,回调函数调用时,会传入错误对象;写入成功,会传入null
    if(err){
    
    
        console.log('写入失败');
        return;
    }
    console.log('写入成功');
});

1.1 writeFile 异步写入

语法: fs.writeFile(file, data[, options], callback)
参数说明:

  • file 文件名
  • data 待写入的数据
  • option 选项设置(可选)
  • callback 写入回调

返回值: undefined

1.2 writeFileSync 同步写入

1.3 appendFile /appendFileSync 追加写入

//文件名:nodejs-fs/code/2-追加写入.js
const fs = require('fs');	//导入fs模块

//3.追加写入
fs.appendFile('./座右铭.txt','择其善者而从之,择其不善者而改之', err => {
    
    
    if(err){
    
    
        console.log('写入失败');
        return;
    }
    console.log('追加写入成功');
});

fs.appendFileSync('./座右铭.txt','\r\n 温故而知新,可以为师矣。');

// writeFile 实现追加写入
fs.writeFile('./座右铭.txt','one two',{
    
    flag: 'a'}, err => {
    
    
    //写入失败时,回调函数调用时,会传入错误对象;写入成功,会传入null
    if(err){
    
    
        console.log('写入失败');
        return;
    }
    console.log('写入成功');
});

1.4 createWriteStream 流式写入

语法: fs.createWriteStream (path[, options])
参数说明:

  • path 文件路径
  • option 选项设置(可选)

返回值: Object

//文件名:nodejs-fs/code/3-流式写入.js
const fs = require('fs');	//导入fs模块

//4. createWriteStream  流式写入
const ws = fs.createWriteStream('./观书有感.txt');
//write
ws.write('一去二三里\r\n');
ws.write('烟村四五家\r\n');
ws.write('亭台六七座\r\n');
ws.write('八九十之花\r\n');
//关闭通道
ws.close();	//可不加这一句

1.5文件写入应用场景

需要持久化保存数据的时候,应该想到文件写入

文件写入在计算机中是一个非常常见的操作,下面的场景都用到了文件写入:

  • 下载文件
  • 安装软件
  • 保存程序日志,如Git
  • 编辑器保存文件

2.文件读取

文件读取:就是通过程序从文件中取出其中的数据,可用如下几种方式:

方法 说明
readFile 异步读取
readFileSync 同步读取
createReadStream 流式读取

2.1 readFile 异步读取

语法: fs.readFile (path[, options],callback)
参数说明:

  • path 文件路径
  • option 选项设置(可选)
  • callback 回调函数

返回值:undefined

//文件名:nodejs-fs/code/4-文件读取.js
const fs = require('fs');	//导入fs模块

//2.1 readFile 异步读取
fs.readFile('./观书有感.txt', (err,data) => {
    
    
    if(err) throw err;
    console.log(data);
    console.log(data.toString());
}); 

2.2 readFileSync 同步读取

//文件名:nodejs-fs/code/4-文件读取.js
const fs = require('fs');	//导入fs模块

//2.2 readFileSync 同步读取
let data = fs.readFileSync('./观书有感.txt');
console.log(data);
console.log(data.toString());

2.3 createReadStream 流式读取

//文件名:nodejs-fs/code/5-流式读取.js
const fs = require('fs');	//导入fs模块

//2.3 createReadStream 流式读取
//创建读取流对象
const rs = fs.createReadStream('爱你.mp4');
//绑定 data 事件; chunk 块儿
rs.on('data',chunk => {
    
    
    console.log(chunk);
    console.log(chunk.length); //65536 字节 => 64 KB
})

// end 事件 可选
rs.on('end',() => {
    
    
    console.log('读取完成');
})

2.4 文件读取应用场景

  • 电脑开机
  • 程序运行
  • 编辑器打开文件
  • 查看照片
  • 播放视频
  • 播放音乐
  • Git查看日志
  • 上传文件
  • 查看聊天记录

3.文件复制、重命名与移动

文件复制:

//文件名:nodejs-fs/code/6-文件复制.js
/** 文件复制需求: 
 * 复制 【爱你.mp4】
 */
const fs = require('fs');	//导入fs模块
//process是Node.js内置模块;memoryUsage是process的一个方法,获取内存占用量
const process = require('process');     

//方式一 readFile
let data = fs.readFileSync('./爱你.mp4');   //读取文件内容
fs.writeFileSync('./资料/爱你.mp4', data);  //写入文件
console.log(process.memoryUsage());     //rss:50020352 字节
/**
 {
  rss: 50020352,
  heapTotal: 6438912,
  heapUsed: 5848504,
  external: 20551626,
  arrayBuffers: 20120219
}
 */
 
//方式二 流式操作 【该方式更好,所占资源少】
const rs = fs.createReadStream('./爱你.mp4');           //创建读取流对象
const ws = fs.createWriteStream('./资料/爱你1.mp4');    //创建写入流对象
//绑定 data 事件
rs.on('data',chunk => {
    
    
    ws.write(chunk);
});
rs.on('end',() => {
    
    
    console.log(process.memoryUsage());		//rss: 43552768 字节
});

//方式三 流式操作 【该方式用的不多】
const rs = fs.createReadStream('./爱你.mp4');           //创建读取流对象
const ws = fs.createWriteStream('./资料/爱你2.mp4');    //创建写入流对象
rs.pipe(ws);

文件重命名与移动:

//文件名:nodejs-fs/code/7-文件重命名与移动.js
/** 文件重命名需求: 
 * 座右铭.txt 重命名为 论语.txt 
 */
const fs = require('fs');	//导入fs模块

//调用 rename 方法 进行文件重命名
fs.rename('./座右铭.txt','./论语.txt', err => {
    
    
    if(err){
    
    
        console.log('操作失败');
        return;
    }
    console.log('操作成功');
});

//文件的移动
fs.rename('./遇见.mp3','./资料/遇见.mp3', err => {
    
    
    if(err){
    
    
        console.log('操作失败');
        return;
    }
    console.log('操作成功');
});  

4.文件删除

在Node.js中,可用unlink 、unlinkSync 、rm 、 rmSync 来删除文件
语法:
fs.unlink(path,callback)
fs.unlinkSync(path)
fs.rm(path,callback)
fs.rmSync(path)
参数说明:

  • path 文件路径
  • callback 回调函数
//文件名:nodejs-fs/code/8-删除文件.js
const fs = require('fs');	//导入fs模块
// 调用 unlink 方法 unlinkSync
fs.unlink('./资料/爱你.mp4', err => {
    
    
    if(err){
    
    
        console.log('删除失败');
        return;
    }
    console.log('删除成功');
});
fs.unlinkSync('./爱你.mp4');

// 调用 rm 方法 Node.js的14.4版本引入  rmSync
fs.rm('./资料/爱你2.mp4', err => {
    
    
    if(err){
    
    
        console.log('删除失败');
        return;
    }
    console.log('删除成功');
});
fs.rmSync('./资料/爱你1.mp4');

5.文件夹操作

借助Node.js的能力,可对文件进行创建、读取、删除等操作。

方法 说明 语法
mkdir 创建文件夹 mkdir(path[, options],callback)
mkdirSync 创建文件夹 mkdirSync(path[, options])
readdir 读取文件夹 readdir(path[, options],callback)
readdirSync 读取文件夹 readdirSync(path[, options])
rmdir 删除文件夹 rmdir(path[, options],callback)
rmdirSync 删除文件夹 rmdirSync(path[, options])
//文件名:nodejs-fs/code/9-文件夹操作.js
const fs = require('fs');	//导入fs模块

//创建文件夹; mk make 制作;dir directory 文件夹
fs.mkdir('./html', err => {
    
    
    if(err){
    
    
        console.log('创建失败');
        return;
    }
    console.log('创建成功');    
});

//递归创建文件夹
fs.mkdir('./a/b/c',{
    
    recursive: true}, err => {
    
    
    if(err){
    
    
        console.log('创建失败');
        return;
    }
    console.log('创建成功');    
});

//读取文件夹
fs.readdir('./资料', (err,data) => {
    
    
    if(err){
    
    
        console.log('读取失败');
        return;
    }
    console.log(data);   
}); //结果为 [ '爱你1.mp4', '爱你2.mp4', '遇见.mp3' ]

//删除文件夹 rm remove 移除
fs.rmdir('./html', err => {
    
    
    if(err){
    
    
        console.log('删除失败');
        return;
    }
    console.log('删除成功');   
});

//递归删除文件夹 【不推荐使用】
fs.rmdir('./a',{
    
    recursive: true}, err => {
    
    
    if(err){
    
    
        console.log('删除失败');
        return;
    }
    console.log('删除成功');   
});

//递归删除文件夹 【推荐使用】
fs.rm('./a',{
    
    recursive: true}, err => {
    
    
    if(err){
    
    
        console.log('删除失败');
        return;
    }
    console.log('删除成功');   
});

在这里插入图片描述在这里插入图片描述

6.查看资源状态

在Node.js中,可用stat 、 statSync来查看资源的详细信息。
语法:
fs.stat (path[, options],callback)
fs.statSync (path[, options])

//文件名:nodejs-fs/code/10-查看资源信息.js
const fs = require('fs');	//导入fs模块

// stat 方法 status 缩写 状态
fs.stat('./资料/爱你1.mp4', (err,data) => {
    
    
    if(err){
    
    
        console.log('操作失败');
        return;
    }
    console.log(data);   
    console.log(data.isFile());         //isFile检测是否为文件
    console.log(data.isDirectory());    //isDirectory检测是否为文件夹
});
/*结果如下:
Stats {
  dev: 177919585,
  mode: 33206,
  nlink: 1,
  uid: 0,
  gid: 0,
  rdev: 0,
  blksize: 4096,
  ino: 1125899907180791,
  size: 20102613,							 //文件大小
  blocks: 39264,
  atimeMs: 1685517209138.5369,
  mtimeMs: 1685517209138.5369,
  ctimeMs: 1685517209138.5369,
  birthtimeMs: 1685516572800.8633,
  atime: 2023-05-31T07:13:29.139Z,
  mtime: 2023-05-31T07:13:29.139Z,			//最后修改时间
  ctime: 2023-05-31T07:13:29.139Z,
  birthtime: 2023-05-31T07:02:52.801Z		//创建时间
}
true
false
*/

7.相对路径问题

fs模块对资源进行操作时,路径的写法有两种:

相对路径:

  • . /座右铭.txt :当前目录下的座右铭.txt
  • 座右铭.txt :等效于上面的写法
  • . . /座右铭.txt :当前目录的上一级目录中的座右铭.txt

绝对路径:

  • D:/Program Files :windows系统下的绝对路径
  • /usr/bin :linux系统下的绝对路径

相对路径中所谓的当前目录 ,指的是命令行的工作目录,而并非是文件的所在目录;
所以当命令行的工作目录与文件所在目录不一致时,会出现一些BUG.

8._ _dirame【相对路径的Bug与解决】

//文件名:nodejs-fs/code/12-相对路径的BUG.js
const fs = require('fs');

//相对路径参照物:命令行的工作目录
fs.writeFileSync('./index.html','love');

//绝对路径 ‘全局变量’保存的是:所在文件的所在目录的绝对路径
console.log(__dirname);
fs.writeFileSync(__dirname + '/index.html','love');

9.练习:批量重命名

//文件名:nodejs-fs/1-重命名.js
const fs = require('fs');
//读取 code 文件夹
const files = fs.readdirSync('./code');
console.log(files);

//遍历数组
files.forEach(item => {
    
    
// 拆分文件名
let data = item.split('-');
let [num, name] = data;
//判断
if(Number(num) < 10){
    
    
	num = '0' + num;
}
//创建新的文件名
let newName = num + '-' + name;
//重命名
fs.renameSync(`./code/${
      
      item}`, `./code/${
      
      newName}`);
});

猜你喜欢

转载自blog.csdn.net/qq_41361442/article/details/130975072