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); //
读取文件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。