File System表示文件系统, fs
为它的缩写。这里只简单使用常用的方法,更多的使用方法请参阅官网File System。
对于文件的操作,大多数API都提供了三种方式:
- 同步操作文件:代码会被阻塞,不会继续执行;
- 异步回调函数操作文件:代码不会被阻塞,需要传入回调函数,当获取到结果时,回调函数被执行;
- 异步Promise操作文件:代码不会被阻塞,通过 fs.promises 调用方法操作,会返回一个Promise,可以通过then、catch进行处理;
所有文件系统操作都有同步、回调和基于Promise
的表单。
一、 引入方式
const fs = require('fs')
二、文件三种操作方式
假设有一个名为 temp.txt
的文件,里面内容为:
Hello Passer! Let's learn node.js File System !
- 同步操作文件(
代码会被阻塞,不会继续执行
)
const state = fs.statSync('./temp.txt')
console.log(state);
console.log('--------分割线--------');
- 异步回调函数操作文件(
代码不会被阻塞,需要传入回调函数,当获取到结果时,回调函数被执行;
)
fs.stat('./temp.txt', (err, state) => {
if (err) {
console.log(err);
return
}
console.log(state);
})
console.log('--------分割线--------');
- 异步Promise操作文件(
代码不会被阻塞,通过 fs.promises 调用方法操作,会返回一个Promise,可以通过then、catch进行处理;
)
fs.promises.stat('./temp.txt').then(state => {
console.log(state);
}).catch(er => {
console.log(err);
})
console.log('--------分割线--------');
三、文件描述符
Node.js 抽象出操作系统之间的特定差异,并为所有打开的文件分配一个数字型的文件描述符,一旦被分配,则文件描述符可用于从文件读取数据、向文件写入数据、或请求关于文件的信息。
获取文件描述符的方法: fs.open()
// 获取文件描述符
fs.open('./temp.txt', 'r', (err, fd) => {
console.log(fd);//30
})
当获取到文件描述符以后可以根据描述符读取文件信息
// 根据文件描述符读取文件信息
fs.fstat(30, (err, state) => {
console.log(state)
})
四、操作文件内容
我们要操作文件的内容,则需要借助一下API来实现:
fs.readFile(path[, options], callback):读取文件的内容;
fs.writeFile(file, data[, options], callback):在文件中写入内容;
1. 文件读取
// 文件读取
fs.readFile('./temp.txt', (err, data) => {
console.log(data); //<Buffer 48 65 6c 6c 6f 20 50 61 73 73 65 72 21 20 4c 65 74 27 73 20 6c 65 61 72 6e 20 6e 6f 64 65 2e 6a 73 20 46 69 6c 65 20 53 79 73 74 65 6d 20 21>
读取文件options可以接收encoding
用于设置读取文件的内容编码方式,这也就是为什么上面的输出是Buffer。
设置读取文件内容的编码方式
fs.readFile('./temp.txt',{encoding:'utf-8'}, (err, data) => {
console.log(data); //Hello Passer! Let's learn node.js File System !
})
2. 文件写入
fs.writeFile('./temp.txt', 'hahaha', {flag: 'w+'}, err => {
if (err) {
console.log('写入文件失败=', err);
} else {
console.log('写入文件成功');
}
})
hahaha
为写入文件里面的内容,上面的方式会把原来的文件的内容覆盖。原因是{flag: 'w+'}
.
flag
的值有很多:快速查看
-
w
打开文件写入,默认值; -
w+
打开文件进行读写,如果不存在则创建文件; -
r+
打开文件进行读写,如果不存在那么抛出异常; -
r
打开文件读取,读取时的默认值; -
a
打开要写入的文件,将流放在文件末尾。如果不存在则创建文件; -
a+
打开文件以进行读写,将流放在文件末尾。如果不存在则创建文件
五、文件夹的操作
1. 创建文件夹
创建文件夹可以使用fs.mkdir()
或者fs.mkdirSync()
比如创建一个名为home
的文件夹,
const dirName = './home'
// 判断是否存在这个文件夹
if (!fs.existsSync(dirName)) {
//创建文件夹
fs.mkdir(dirName, er => {
console.log(er);
})
} else {
console.log('已经存在了');
}
fs.existsSync(dirName)
是判断这个文件夹是否已经存在
2.读取文件夹的内容
读取文件夹的内容可以使用fs.readdir(path[, options], callback)
或者fs.readdirSync(path[, options])
//获取文件夹下的所有文件不包含子文件夹的文件
fs.readdir(dirName,{ withFileTypes: true }, (err, files) =>{
console.log(files); //[ Dirent { name: 'eeee.js', [Symbol(type)]: 1 } ]
})
3.文件夹的重命名
文件夹的重命名使用 fs.rename(oldPath, newPath, callback)
或者fs.renameSync(oldPath, newPath)
fs.rename(dirName, './passer33', er => {
console.log(er);
})
这里就把原来的home
改名为passer33
.
这里只简单使用常用的方法,更多的使用方法请参阅官网File System。