fs 模块(文件系统)


什么是fs?

fs 全称为 file system ,称之为 文件系统 ,是 Node.js 中的 内置模块 ,可以对计算机中的磁盘进行操作。

相对路径 的参照物:命令行的工作目录
绝对路径 则是:文件的所在目录的绝对路径

慎用相对路径

  • (1)在使用run Code执行代码 或 使用终端进行执行代码时,使用相对路径写入文件时,文件会以run Code的目录为基准文件进行创建,可能不是自己想要的效果
  • (2)尽量使用绝对路径,可看 path 模块

一、文件写入

文件写入就是将 数据 保存到 文件 中,我们可以使用如下几个方法来实现该效果

方法说明
writeFile异步写入
writeFileSync同步写入
appendFile / appendFileSync追加写入
createWriteStream流式写入

1、writeFile 异步写入

语法:fs.writeFile(file, data[, options], callback)

参数说明:

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

返回值:undefined

代码示例:

// 1.导入fs模块
const fs = require('fs')

// 2.异步写入文件
fs.writeFile('./座右铭.txt', "三人行,则必有我师焉", err => {
  // err 写入失败:错误对象   写入成功:null
  if (err) {
    console.log('写入失败')
    return
  }
  console.log('写入成功')
})

2、writeFileSync 同步写入

语法: fs.writeFileSync(file, data[, options])

参数说明:

  • file 文件名
  • data 待写入的数据
  • options 选项设置 (可选

返回值:undefined

代码示例:

const fs = require('fs')
fs.writeFileSync('./座右铭.txt', '三人行,必有我师焉。');

Node.js 中的磁盘操作是由其他 线程 完成的,结果的处理有两种模式:

  • 同步处理 JavaScript 主线程 会等待 其他线程的执行结果,然后再继续执行主线程的代码,效率较低
  • 异步处理 JavaScript 主线程 不会等待 其他线程的执行结果,直接执行后续的主线程代码,效率较好

3、appendFile / appendFileSync 追加写入

appendFile 作用是在文件尾部追加内容,appendFile 语法与 writeFile 语法完全相同

语法:
fs.appendFile(file, data[, options], callback)
fs.appendFileSync(file, data[, options])

返回值:二者都为 undefined

代码示例:

// 导入 fs
const fs = require('fs')

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

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

4、createWriteStream 流式写入

语法:fs.createWriteStream(path[, options])

参数说明:

  • path 文件路径
  • options 选项配置(可选

返回值: Object

代码示例:

// 1.导入 fs
const fs = require('fs')

// 2.创建写入流对象
const ws = fs.createWriteStream('./观书有感.txt')

// 3.write
ws.write('半亩方塘一鉴开\r\n')
ws.write('天光云影共徘徊\r\n')
ws.write('问渠那得清如许\r\n')
ws.write('唯有源头活水来\r\n')

// 4.关闭通道
ws.close()

程序打开一个文件是需要消耗资源的 ,流式写入可以减少打开关闭文件的次数。
流式写入方式适用于 大文件写入或者频繁写入 的场景, writeFile 适合于 写入频率较低的场景

二、文件读取

文件读取顾名思义,就是通过程序从文件中取出其中的数据,我们可以使用如下几种方式:

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

1、 readFile 异步读取

语法:fs.readFile(path[, options], callback)

参数说明:

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

返回值:undefined

代码示例:

// 导入 fs 模块
const fs = require('fs');

// 异步读取
fs.readFile('./座右铭.txt', (err, data) => {
  if(err) throw err;
  console.log(data);
});

// 异步读取文件并设置编码格式为UTF-8
fs.readFile('./座右铭.txt', 'utf-8',(err, data) => {
  if(err) throw err;
  console.log(data);
});

2、readFileSync 同步读取

语法:fs.readFileSync(path[, options])

参数说明:

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

返回值:string | Buffer

代码示例:

// 导入 fs 模块
const fs = require('fs');

// 同步读取
let data1 = fs.readFileSync('./座右铭.txt');

// 同步读取文件并设置编码格式为UTF-8
let data2 = fs.readFileSync('./座右铭.txt', 'utf-8');

3、createReadStream 流式读取

语法:fs.createReadStream(path[, options])

参数说明:

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

返回值:Object

代码示例:

// 导入 fs 模块
const fs = require('fs');

//创建读取流对象
let rs = fs.createReadStream('./观书有感.txt');

//每次取出 64k 数据后执行一次 data 回调
rs.on('data', data => {
  console.log(data);
  console.log(data.length);
});

//读取完毕后, 执行 end 回调
rs.on('end', () => {
  console.log('读取完成')
})

三、文件移动与重命名

在 Node.js 中,我们可以使用 renamerenameSync 来移动或重命名 文件或文件夹

语法:
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)

参数说明:

  • oldPath 文件当前的路径
  • newPath 文件新的路径
  • callback 操作后的回调

代码示例:

fs.rename('./观书有感.txt', './论语/观书有感.txt', (err) =>{
	if(err) throw err;
	console.log('移动完成')
});
fs.renameSync('./座右铭.txt', './论语/我的座右铭.txt');

四、文件删除

在 Node.js 中,我们可以使用 unlinkunlinkSync 来删除文件
语法:
fs.unlink(path, callback)
fs.unlinkSync(path)
参数说明:

  • path 文件路径
  • callback 操作后的回调

代码示例:

// 导入 fs 模块
const fs = require('fs');

// 异步删除
fs.unlink('./test.txt', err => {
  if(err) throw err;
  console.log('删除成功');
});

// 同步删除
fs.unlinkSync('./test2.txt');

五、文件夹操作

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

方法说明
mkdir / mkdirSync创建文件夹
readdir / readdirSync读取文件夹
rmdir / rmdirSync删除文件夹

1、mkdir 创建文件夹

在 Node.js 中,我们可以使用 mkdirmkdirSync 来创建文件夹

语法:
fs.mkdir(path[, options], callback)
fs.mkdirSync(path[, options])

参数说明:

  • path 文件路径
  • options 选项配置( 可选
  • callback 操作后的回调

代码示例:

// 导入 fs 模块
const fs = require('fs');

//异步创建文件夹
fs.mkdir('./page', err => {
  if(err) throw err;
  console.log('创建成功');
});

//递归异步创建
// recursive 递归的
fs.mkdir('./1/2/3', {recursive: true}, err => {
  if(err) throw err;
  console.log('递归创建成功');
});

//递归同步创建文件夹
fs.mkdirSync('./x/y/z', {recursive: true});

2、readdir 读取文件夹

在 Node.js 中,我们可以使用 readdirreaddirSync 来读取文件夹

语法:
fs.readdir(path[, options], callback)
fs.readdirSync(path[, options])

参数说明:

  • path 文件路径
  • options 选项配置( 可选
  • callback 操作后的回调

代码示例:

// 导入 fs 模块
const fs = require('fs');

//异步读取
fs.readdir('./论语', (err, data) => {
  if(err) throw err;
  console.log(data);
});

//同步读取
let data = fs.readdirSync('./论语');
console.log(data);

3、rmdir 删除文件夹

在 Node.js 中,我们可以使用 rmdirrmdirSync 来删除文件夹

语法:
fs.rmdir(path[, options], callback)
fs.rmdirSync(path[, options])

参数说明:

  • path 文件路径
  • options 选项配置( 可选
  • callback 操作后的回调

代码示例:

// 导入 fs 模块
const fs = require('fs');

//异步删除文件夹
fs.rmdir('./page', err => {
  if(err) throw err;
  console.log('删除成功');
});

//异步递归删除文件夹
fs.rmdir('./1', {recursive: true}, err => {
  if(err) {
    console.log(err);
  }
  console.log('递归删除')
});

//同步递归删除文件夹
fs.rmdirSync('./x', {recursive: true})

六、查看资源状态

在 Node.js 中,我们可以使用 ·stat· 或 ·statSync· 来查看资源的详细信息

语法:
fs.stat(path[, options], callback)
fs.statSync(path[, options])

参数说明:

  • path 文件路径
  • options 选项配置( 可选
  • callback 操作后的回调

代码示例:

//异步获取状态
fs.stat('./data.txt', (err, data) => {
  if(err) throw err;
  console.log(data);
});

//同步获取状态
let data = fs.statSync('./data.txt');
console.log(data);

结果值对象结构:

  • size 文件体积
  • birthtime 创建时间
  • mtime 最后修改时间
  • isFile 检测是否为文件
  • isDirectory 检测是否为文件夹
  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
F2FS是Flash-Friendly File System的简称,是专门为闪存设备设计的文件系统。它采用了一些新的设计思路和数据结构,能够更好地充分利用闪存设备的性能和寿命。F2FS的代码架构可以分为以下几个部分: 1. F2FS核心模块:F2FS核心模块负责管理整个文件系统的元数据,包括超级块、inode、数据块、日志等。它也是整个F2FS文件系统的入口,提供了文件系统的操作接口。 2. Checkpoint模块:Checkpoint模块负责管理F2FS的日志和检查点机制。在F2FS中,所有的操作都是先入日志,然后再同步到数据块中。Checkpoint模块会定期将日志和数据同步到检查点中,以保证文件系统的一致性和可靠性。 3. GC模块:GC模块负责管理F2FS的垃圾回收机制。由于闪存设备的入操作是有限制的,因此需要定期进行垃圾回收以释放已经不再使用的空间。 4. Compression模块:Compression模块负责对数据进行压缩和解压缩,以节省存储空间和提高读性能。 5. Encryption模块:Encryption模块负责对文件和数据进行加密和解密,以保护用户数据的安全性。 6. Mount模块:Mount模块负责F2FS文件系统的挂载和卸载操作,以及文件系统的格式化和初始化等操作。 总之,F2FS的代码架构设计得非常清晰和模块化,各个模块之间相互独立,并且有很好的扩展性和灵活性。这也是F2FS能够在闪存设备中发挥出色性能和可靠性的重要原因之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值