fs模块和path模块

更新时间: 2024-10-25 09:42:03

fs = file system 文件系统

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

# 写入文件

# writeFile异步写入

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

参数说明:

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

返回值: undefined

/**
 * 需求:
 * 新建一个文件,座右铭.txt,写入内容,三人行,则必有我师焉  
 */

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

// 2. 写入文件
fs.writeFile('./座右铭.txt', '三人行,则必有我师焉', err => {
    // err 写入失败:错误对象  写入成功:null
    if(err) {
        console.log('写入失败')
        return 
    }
    console.log('写入成功 ')
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 同步写入

// 同步写入
fs.writeFileSync('./data.txt','test') 
1
2

# 文件追加写入

appendFile / appendFileSync追加写入

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

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

返回值:二者都为 undefined

const fs = require('fs')  

fs.appendFile('./座右铭.txt', ',则其善者而从之,其不善者而改之', err => {
    if(err) {
        console.log('追加失败')
        return
    }
    console.log('追加成功')
})
1
2
3
4
5
6
7
8
9

# createWriteStream流式写入

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

参数说明:

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

返回值: Object

注意

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

const fs = require('fs')

// 创建写入流对象  
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
2
3
4
5
6
7
8
9
10
11
12
13

# 文件写入应用场景

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

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

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

# 文件读取

# realFile 异步读取

fs.readFile(path[, options],callback)

参数说明:

  • path 文件路径
  • options 选项配置
  • callback 回调函数

返回值: undefined

const fs = require('fs')

// 异步读取  
fs.readFile('./观书有感.txt',(err, data) => {
    if(err) {
        console.log('读取失败~')
        return  
    }
    console.log(data.toString())
})
1
2
3
4
5
6
7
8
9
10

# 文件读取应用场景

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

# 文件流式读取

const fs = require('fs')

// 创建读取流对象
const rs = fs.createReadStream('../02-快速入门Cocos Creator资料/01_讲义/快速入门.md')

// 绑定data事件  
rs.on('data', chunk => {
    console.log(chunk)
})


// end 可选事件
rs.on('end',() => {
    console.log('读取完成')
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

文件读取每次会读出64kb的数据

# 文件复制

/**
 * 需求:
 *      复制【资料】文件夹下的【笑看风云.mp4】
 */
const fs = require('fs')
// 方式一 readFile  
// 读取文件内容
let data = fs.readFileSync('../02-快速入门Cocos Creator资料/01_讲义/快速入门.md')  
// 写入文件  
fs.writeFileSync('./copy.md', data)

// 方式二 流式操作
// 创建读取流对象
const rs = fs.createReadStream('../02-快速入门Cocos Creator资料/01_讲义/快速入门.md')  
// 创建写入流对象  
const ws = fs.createWriteStream('./copy.md')  

// 绑定data事件  
rs.on('data', chunk => {
    ws.write(chunk)
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

第二种要好一些,理想状态下只要有64kb的内存就可以完成复制

# 文件重命名和移动

可以使用renamerenameSync来移动或重命名文件或文件夹,语法:
fs.rename(oldPath, newPath, callback)
fa.renameSync(oldPath, newPath)

const fs = require('fs')

// 重名名
fs.rename('./座右铭.txt', './论语.txt', err => {
    if(err) {
        console.log('操作失败')
        return 
    }
    console.log('操作成功')
})

// 移动文件  
fs.rename('./观书有感.txt', './资料/观书有感.txt', err => {
    if(err) {
        console.log('操作失败')
        return 
    }
    console.log('操作成功')
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 文件删除

使用unlink 或 unlinkSync, rm ,rmSync 来删除文件

fs.unlink(path, callback)
fs.unlinkSync(path)
fs.rm(path, callback)
fs.rmSync(path)

const fs = require('fs')

// 调用unlink方法
fs.unlink('./资料/观书有感.txt', err => {
    if(err) {
        console.log('删除失败')
        return 
    }
    console.log('删除成功')
})

// 调用rm方法
fs.rm('./论语.txt',err => {
    if(err) {
        console.log('删除失败')
        return 
    }
    console.log('删除成功')
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 文件夹操作

# 创建

mkdir, mkdirSync

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

# 读取

readdir, readdirSync

# 删除

rmdir, rmdirSync

const fs = require('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('创建成功')
})

// 读取文件夹 read 读取 dir directory 文件夹  
fs.readdir('./资料',(err, data) => {
    if(err) {
        console.log('读取失败')
        return 
    }
    console.log(data)
})

// 删除文件夹  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('删除成功')
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

# 查看资源状态

stat, statSync

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

结果值对象结构:

  • size 文件体积
  • birthtime 创建时间
  • mtime 最后修改时间
  • isFile 检测是否为文件
  • isDirectory 检测是否为文件夹
  • atime 最后的访问时间
  • ctime 最后一次修改文件状态的时间

# 路径补充说明

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

  • 相对路径

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

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

# 相对路径的Bug与解决

__dirname : 所在文件的所在目录的绝对路径

# path模块

path模块提供了操作路径的功能:

API 说明
path.resolve 拼接规范的绝对路径
path.sep 获取操作系统的路径分隔符
path.parse 解析路径并返回对象
path.basename 获取路径的基础名称
path.dirname 获取路径的目录名
path.extname 获得路径的扩展名
const fs = require('fs')
const path = require('path')  

// resolve
console.log(path.resolve(__dirname, 'index.html'))
// E:\zz\node_study\index.html

// sep 分隔符
console.log(path.sep)  // \

// parse 方法
console.log(__filename) // 文件的绝对路径  
let str = 'E:\\zz\\node_study\\hello.js'
console.log(path.parse(str))
//{
//     root: 'E:\\',
//     dir: 'E:\\zz\\node_study',
//     base: 'hello.js',
//     ext: '.js',
//     name: 'hello'
//   }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21