从0到1学习node.js(fs模块)

一、计算机基础知识

计算机的组成

  • 中央处理器(CPU):计算机的大脑,负责解释和执行指令,以及处理数据。
  • 内存(RAM):临时存储数据和程序的地方,CPU直接从中读取数据进行处理,读取速度快。
  • 存储设备:
    硬盘驱动器(HDD):用于长期存储数据。
    固态硬盘(SSD):比HDD更快,没有机械部件,耐用性更好。
  • 主板(Motherboard):所有硬件组件连接的平台,提供数据传输的通道。
  • 扩展卡:
    声卡:处理音频输入和输出。
    网络卡:提供网络连接功能。
    显卡:增强图形处理能力。
  • 软件组成
    ·操作系统(OS):管理和协调计算机硬件与软件资源的软件,如Windows、macOS、Linux等。
    应用程序(Applications):用户直接使用的软件,如文字处理软件、浏览器、游戏等。
    实用程序(Utilities):用于维护和优化计算机性能的软件,如磁盘清理工具、防病毒软件等。
    驱动程序(Drivers):允许操作系统与硬件设备通信的软件。
    固件(Firmware):嵌入在硬件设备中的软件,用于控制硬件的基本功能。

二、正式学习node.js

学习之前先介绍两个全局变量

  • __dirname 绝对路径,他指向的是当前文件路径的绝对路径。所以我们在fs操作的时候都使用这个,以免发生执行文件位置导致操作文件错误
  • __filename 当前文件夹的绝对路径,包括文件名
    在这里插入图片描述
    fs所有方法的第一个参数的目录,不是相对于文件所以位置的目录。是相对于命令行当前所在的目录在哪个文件夹下执行代码,就在哪个文件夹下面进行文件操作
一、fs模块

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

1、文件的创建并写入一些内容
// 1.导入fs模块
const fs = require('fs')

// 异步 创建文件并写入内容
fs.writeFile('./test.txt', '三人行,必有我师焉', err => {
    if (err) {
        console.log('写入失败')
        return
    } else {
        console.log('写入成功')
    }
})

// 同步 创建文件并写入内容
fs.writeFile('./test.txt', '三人行,必有我师焉')
2、追加写入

追加的应用场景一般用于记录日志
同步追加代码要比异步追加代码先被执行,这是因为同步和异步的执行机制。文章最后会详细总结一波。

// 异步追加
fs.appendFile(__dirname + '/test.txt', '追加数据', err => {
    if (err) {
        console.log('追加失败')
        return
    }
    console.log('追加成功')
})

// 同步追加
fs.appendFileSync(__dirname + '/test.txt')

也可以使用write实现追加的效果,需要传入第三个参数,{flag:'a'}

// 异步追加
fs.writeFile(__dirname + '/study/a/index.txt', 'write追加', {
    flag: 'a'
}, err => {
    if (err) {
        console.log('追加失败')
        return
    }
    console.log('追加成功')
})
// 同步追加
fs.writeFileSync(__dirname + '/study/a/index.txt', 'write追加', {
    flag: 'a'
})
3、流式写入

这种写入方式如果文件不存在就会创建文件文件已经存在将会替换掉原来的内容。相当于长连接,在关闭之前随时可以写入,更适合写入频繁的场景。
以前的写入是一次性的,写入完成以后就直接断开连接;

// 创建写入流对象
const ws = fs.createWriteStream(__dirname + '/study/a/index.txt')

ws.write('1111111')
ws.write('2222222')
ws.write('3333333')
ws.write('4444444')

// 关闭流写入  流式写入的方式close方法可调用可不调用。因为执行完以后资源会被回收
ws.close() 

文件写入的使用场景
当需要持久化保存数据的时候,就要考虑文件写入了

  • 下载文件
  • 安装软件
  • 保存程序日志,例如Git 编辑器
  • 保存文件
  • 视频录制
4、文件读取
// 异步读取
fs.readFile(__dirname + '/study/a/index.txt', (err, data) => {
    if (err) {
        console.log('读取失败')
        return
    }
    console.log(data)
})

// 同步读取
const fsData = fs.readFileSync(__dirname + '/study/a/index.txt')

console.log(fsData)

读取文件的应用场景

  • 电脑开机
  • 程序运行
  • 编辑器打开文件
  • 查看图片
  • 播放视频
  • 播放音乐
  • Git查看日志
  • 上传文件
  • 查看聊天记录
5、流式读取
// 创建读取流对象
const rs = fs.createReadStream(__dirname + '/study/a/index.txt')

// 绑定data方法
rs.on('data', chunk => {
    console.log(chunk)  // 每次的长度是65536  64KB 
})

// 读取完毕时调用
rs.on('end', () => {
    console.log('读取完毕')
})

6、复制文件练习
// 方法一 使用流的形式
// 创建读取流对象
const rs = fs.createReadStream('../文件/视频.mp4')
// 创建写入流对象
const ws = fs.createWriteStream('../文件/视频copy.mp4')

rs.on('data', chunk => {
    ws.write(chunk)
})

rs.on('end', () => {
    console.log('读取完毕')
})

// 方法二
fs.readFile('../文件/视频.mp4', (err, data) => {
    if (err) {
        console.log('读取失败!')
        return
    }
    fs.writeFileSync('../文件/视频5.mp4', data)
})
// 或者直接使用这段代码。
rs.pipe(ws) // 这段可以直接实现复制,pipe的意思是管道,将写入流交给读取流
7、文件重命名和移动
// 文件重命名
fs.rename('../文件/视频5.mp4', '../文件/视频55.mp4', err => {
    if (err) {
        console.log('重命名失败')
        return
    }
    console.log("重命名成功")
})

// 文件移动
fs.rename('../文件/视频55.mp4', '../视频55.mp4', err => {
    if (err) {
        console.log('移动失败')
        return
    }
    console.log("移动成功")
})

// 同步写法
// 同步 重命名
fs.renameSync('../文件/视频5.mp4', '../文件/视频55.mp4')
// 同步 移动
fs.renameSync('../文件/视频55.mp4', '../视频55.mp4')
8、文件删除
// 14.4版本 新增
fs.rm('../文件/视频555.mp4', err => {
    if (err) {
        console.log('删除失败')
        return
    }
    console.log("删除成功")
})

fs.unlink('../文件/视频5.mp4', err => {
    if (err) {
        console.log('删除失败')
        return
    }
    console.log("删除成功")
})
9、创建文件夹
// 创建文件夹
fs.mkdir(__dirname + '/study', err => {
    if (err) {
        console.log('创建失败')
        return
    }
    console.log("创建成功")
})

// 创建多级文件夹  需要配置第二个参数 递归
fs.mkdir(__dirname + '/study/a/b/c', { recursive: true }, err => {
    if (err) {
        console.log('创建失败')
        return
    }
    console.log("创建成功")
})

10、读取文件夹
// 读取文件夹, 可以获取到文件夹下面的文件名称,返回一个数组
fs.readdir(__dirname + '/study', (err, data) => {
    if (err) {
        console.log('读取失败')
        return
    }
    console.log("读取成功", data)
})
// 同步读取
const data = fs.readdirSync(__dirname + '/study')
console.log("读取成功", data)
11、删除文件夹

rmdir 不建议使用,使用后会报错,大概意思就是使用rm代替rmdir
在这里插入图片描述

// 递归删除  recursive  不建议使用 未来会使用rm
fs.rmdir(__dirname + '/study', { recursive: true }, err => {
    if (err) {
        console.log('删除失败')
        return
    }
    console.log("删除成功")
})

// 递归删除 rm  使用后不会有提示
fs.rm(__dirname + '/study', { recursive: true }, err => {
    if (err) {
        console.log('删除失败')
        return
    }
    console.log("删除成功")
})
// 同步方法
fs.rmSync()
12、查看文件状态

可以获取到例如文件大小,创建时间等等

// 查看文件状态
fs.stat('../文件', (err, data) => {
    if (err) {
        console.log('操作失败')
        return
    }
    console.log(data)
    console.log(data.isFile()) // 查看是否为文件
    console.log(data.isDirectory()) // 查看是否为文件夹
})

全部文章
从0到1学习node.js(fs模块)
从0到1学习node.js(path模块以及HTTP协议)
从0到1学习node.js(http模块)
从0到1学习node.js(npm)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值