梦入琼楼寒有月,行过石树冻无烟

Node.js File System

Node.js fs(file system) 即是内置的文件系统模块,用于负责文件的到做以及读取等,可通过 console fs = require("fs") 直接进行引入,因此为了更详细的分清该模块所提供的 API,主要分为:“文件属性读写、文件内容读写、文件操作” 等三种。

fs 模块所提供的方法最大不同之处在于同时还提供了 异步、同步 两个方法,这体现在了 fs.readFile()fs.readFileSync()

options], callback)``` 异步读取文件的全部内容
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
```fs.readFileSync(path[, options])``` 用于返回 path 内容即同步


| Id | Name | Info | Type |
| --- | ------------------------------------------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------- |
| 1 | fs.readFile(path[, options], callback) | 用于异步读取文件 | 文件内容读写 |
| 2 | fs.readFileSync(path[, options]) | 同步读取文件 | 文件内容读写 |
| 3 | fs.read(fd, buffer, offset, length, position, callback) | 在异步模式下更加合理的读取文件 | 文件内容读写 |
| | fd | 通过 ```fs.open()``` 所返回的文件描述 | |
| | buffer | 数据写入缓冲区 | |
| | offset | 缓冲区写入数据写入的偏移量 | |
| | length | 需要读取的字节数 | |
| | position | 文件读取的起始位置 | |
| | callback | 回调函数 | |
| | | err | 返回错误信息 |
| | | bytesRead | 所读取的字节数 |
| | | buffer | 缓冲区对象 |
| 4 | fs.open(path[, flags[, mode]], callback) | 异步打开文件 | 底层文件操作 |
| | path | 文件路径 | |
| | flags | 文件的打开行为 | |
| | | ```a``` | 如果文件不存在则创建文件 |
| | | ```ax``` | 在 ```a``` 的基础上,如果文件路径不存在,就失败 |
| | | ```a+``` | 如果文件不存在就创建 |
| | | ```ax+``` | 在 ```a+``` 的基础上,如果文件路径不存在,则读取失败 |
| | | ```r``` | 以读取的方式打开文件,如果文件不存在则异常 |
| | | ```r+``` | 以读写模式打开文件,如果文件不存在就抛出异常 |
| | | ```rs``` | 以同步的方式读取文件 |
| | | ```rs+``` | 以同步的方式读取和写入文件 |
| | | ```w``` | 以写入模式打开文件,文件不存在则创建 |
| | | ```wx``` | 在 ```w``` 的基础上,如果文件路径存在,文件将会写入失败 |
| | | ```w+``` | 以读写模式打开文件,如果文件不存在则创建 |
| | | ```wx+``` | 在 ```w+``` 的基础上,如果文件路径存在,则文件写入失败 |
| | mode | 打开的权限 | |
| | callback | 回调参数 | |
| 5 | fs.writeFile(file, data[, options], callback) | 通过异步的方式写入文件 | 文件内容读写 |
| | file | 文件名 | |
| | data | 需要写入的数据 | |
| | options | 一个参数对象,包含了编码模式(utf-8)以及 flags(w,写入模式打开文件,文件不存在则创建) | |
| 6 | fs.writeFileSync() | 通过同步的方式写入文件 | 文件内容读写 |
| 7 | fs.stat() | 用于读取文件属性 | 文件属性读写 |
## readFile at readFileSync 读取文件
### fs.readFile()

```js
const fs = require('fs')

fs.readFile('data.txt', 'utf-8', function (err, data) {
if (err) {
console.log(err)
} else {
// File system!
console.log(data.toString())
}
})

data.txt

File system!

与 ```fs.readFileSync()``` 的主要区别就是一个支持异步而另一个仅仅是同步方法,这主要可以根据其 ```callback()``` 就可以分辨出两者的作用与功能上的区分。
1
2
3
4
5
6
7
8
9
10
11
12

这主要涉及到 ```err``` 和 ```data``` 两个参数,后者为 ```undefined```,也就是其 ```path``` 内的数据以字符串的形式进行读取,当发生错误时将会输出 ```err``` 对象。

### fs.readFIleSync()

```js
const fs = require('fs')

var data = fs.readFileSync('data.txt', 'utf-8')

// File system!
console.log(data)

通常默认情况下单个 fs.readFIleSync() 参数是不支持输出错误的,因此我们还需要输出函数的方式输出数据,可配合 try...catch 的方式来实现错误输出:

1
2
3
4
5
6
7
8
const fs = require('fs')

try {
var data = fs.readFileSync('data.txt', 'utf-8')
console.log(data)
} catch (err) {
console.log(err)
}

fs.read(fd, buffer, offset, length, position, callback) at fs.open and fs.close

Id Name Info Type
1 fs.read(fd, buffer, offset, length, position, callback) 在异步模式下更加合理的读取文件 文件内容读写
fd 通过 fs.open() 所返回的文件描述
buffer 数据写入缓冲区
offset 缓冲区写入数据写入的偏移量
length 需要读取的字节数
position 文件读取的起始位置
callback 回调函数
err 返回错误信息
bytesRead 所读取的字节数
buffer 缓冲区对象
可用于更加合理的文件操作,这其中主要包括了 **文件打开 -> 文件写入 —> 文件读取 -> 关闭文件** 的整一套流程,让整个对文件的操作更加合理和直观
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

```js
const fs = require('fs')
const buf = new Buffer.alloc(1024)

/*
准备打开文件
文件打开成功
开始准备读取文件
文件内容为: Hello, File system
文件关闭成功
*/

console.log("准备打开文件")

fs.open('data.txt', 'r+', function (err,fd) {
if (err) {
console.log(err)
}
console.log('文件打开成功\n开始准备读取文件')
fs.read(fd, buf, 0, buf.length, 0, function (err, bytesRead) {
if (err) {
console.log(err)
}

if (bytesRead>0) {
console.log('文件内容为:',buf.slice(0,bytesRead).toString())
}

fs.close(fd, function (err) {
if (err) {
console.log(err)
}
console.log('文件关闭成功')
})
})
})

fs.open()

Id Name Info Type
1 fs.open(path[, flags[, mode]], callback) 异步打开文件 底层文件操作
path 文件路径
flags 文件的打开行为
a 如果文件不存在则创建文件
ax a 的基础上,如果文件路径不存在,就失败
a+ 如果文件不存在就创建
ax+ a+ 的基础上,如果文件路径不存在,则读取失败
r 以读取的方式打开文件,如果文件不存在则异常
r+ 以读写模式打开文件,如果文件不存在就抛出异常
rs 以同步的方式读取文件
rs+ 以同步的方式读取和写入文件
w 以写入模式打开文件,文件不存在则创建
wx w 的基础上,如果文件路径存在,文件将会写入失败
w+ 以读写模式打开文件,如果文件不存在则创建
wx+ w+ 的基础上,如果文件路径存在,则文件写入失败
1
2
3
4
5
6
7
8
9
const fs = require('fs')

// 文件打开成功
fs.open('data.txt', 'r+', function (err, fd) {
if (err) {
return console.error(err)
}
console.log("文件打开成功")
})

fs.writeFile()

Id Name Info Type
1 fs.writeFile(file, data[, options], callback) 通过异步的方式写入文件 文件内容读写
file 文件名
data 需要写入的数据
options 一个参数对象,包含了编码模式(utf-8)以及 flags(w,写入模式打开文件,文件不存在则创建)
1
2
3
4
5
6
7
8
9
// 写入成功: Hello, File system
fs.writeFile('data.txt', data, function (err) {
if (err) {
console.log(err)
} else {
var write = fs.readFileSync('data.txt', 'utf-8')
console.log('写入成功:' ,write)
}
})

fs.writeFileSync()

.fs.writeFileSync()fs.writeFile() 的同步方法,同样也可以使用 try...catch 来支持返回 err 信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
const fs = require('fs')

var data = "Hello, File system"

fs.open('data.txt','r+', function (err,fd) {
if (err) {
return console.error(err)
} else {
fs.writeFileSync('data.txt', data)
// 写入成功 Hello, File system
console.log('写入成功', data )
}
})

获取文件属性 (fs.stat())

“获取文件属性”是指文件的大小、创建时间、修改时间等信息,可以通过 fs.stat(path[, options], callback) 来进行实现,在这个方法中存在着 fs.stats 类,用于获取文件的属性,常用的为:

Id Name Info
1 stat.isFile() 是否是文件
2 stat.isDirectory() 是否是目录
3 stat.size() 文件大小(以字节为单位)
4 stat.birthtime() 创建时间
5 stat.mtime() 修改时间
6 stat.ctime() 最后一次更改时间
7 stat.atimeMS() 最后一次访问时间
8 stat.mtimeMS() 最后一次修改时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const fs = require('fs')

/*
是否是文件: true
文件大小: 18
创建时间: 2021-09-01T02:23:04.637Z
修改时间: 2021-09-01T02:23:04.637Z
最后访问: 2021-09-01T02:23:04.949Z
*/
fs.stat('data.txt', function (err, stat) {
if (err) {
console.log(err)
} else {
console.log("是否是文件:", stat.isFile())
if (stat.isFile()) {
console.log('文件大小:', stat.size)
console.log('创建时间:', stat.birthtime)
console.log('修改时间:', stat.mtime) // stat.ctime
console.log('最后一次访问时间:', stat.atime)
}
}
})
⬅️ Go back