fs模块即Node.js的文件系统模块,是Node.js的核心模块之一,它提供了一个API,以模仿标准 POSIX 函数的方式与文件系统进行交互。
POSIX(Portable Operating System Interface for Computing Systems,可移植操作系统接口)是由 IEEE 和 ISO/IEC 开发的一簇标准,该标准是基于现有的 UNIX 实践和经验,描述了操作系统的调用服务接口。用于保证编制的应用程序可以在源码一级上在多种操作系统上移植和运行。要使用此模块:
const fs = require('fs');
同步和异步
所有的文件系统操作都具有同步和异步的方式。
- 同步:使用同步的操作,代码按顺序执行,且在进行完这行操作之前不会进行下一步操作,发生的异常会立即抛出。
const fs = require('fs');
try {
//读取一个文件
//同步读取,阻塞操作,这行代码不完成之后的代码不执行
const data = fs.readFileSync('./text.js')
console.log(data );
} catch (err) {
// 处理错误
}
- 异步:异步的形式总是把回调函数作为其最后一个参数,回调的参数中第一个参数总是异常信息。使用异步的形式,无法保证顺序,建议都使用异步形式。
const fs = require('fs');
//异步版本
fs.readFile('./text.js',(err,data)=>{
if (err) throw err;
console.log(data)
})
文件路径
文件操作可接受的文件路径如下:
- 字符串:解析为标识绝对或相对文件名的 UTF-8 字符序列
- 绝对路径:以
/
开头
const fs = require('fs');
fs.open('/open/some/file.txt', 'r', (err, fd) => {
if (err) throw err;
fs.close(fd, (err) => {
if (err) throw err;
});
});
- 相对路径:直接用文件名
fs.open('file.txt', 'r', (err, fd) => {
if (err) throw err;
fs.close(fd, (err) => {
if (err) throw err;
});
});
- Buffer路径:与字符串路径一样,Buffer 路径可以是相对路径或绝对路径
绝对路径:
fs.open(Buffer.from('/open/some/file.txt'), 'r', (err, fd) => {
if (err) throw err;
fs.close(fd, (err) => {
if (err) throw err;
});
});
- 使用
file:
协议的URL
对象
对于大多数fs
模块的函数,path
或filename
参数可以传入 WHATWGURL
对象。 仅支持使用file:
协议的URL
对象
const fs = require('fs');
const fileUrl = new URL('file:///tmp/hello');
fs.readFileSync(fileUrl);
创建目录
异步:fs.mkdir(path[, options], callback)
path
| | -
options
-
recursive
默认值: false
。 -
mode
Windows 上不支持。默认值: 0o777
。
-
-
callback
-
err
-
// 创建 /tmp/a/apple 目录,无论是否存在 /tmp 和 /tmp/a 目录。
fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => {
if (err) throw err;
});
同步:fs.mkdirSync(path[, options])
读取目录内容
异步:fs.readdir(path[, options], callback)
path
| | -
options
| -
encoding
默认值: 'utf8'
。 -
withFileTypes
默认值: false
。
-
-
callback
-
err
-
files
| |
-
同步:fs.readdirSync(path[, options])
打开关闭文件
打开:
异步:fs.open(path, flags[, mode], callback)
path
| | flags
| 参阅支持的文件系统标志。 mode
默认值: 0o666
(可读写)。-
callback
-
err
-
fd
-
同步:fs.openSync(path, flags[, mode])
关闭:
- 异步:fs.close(fd, callback)
- 同步:fs.closeSync(fd)
读取文件全部内容
异步:fs.readFile(path[, options], callback)
path
| | | 文件名或文件描述符。 -
options
-
encoding
| 默认值: null
。 -
flag
参阅支持的文件系统标志。默认值: 'r'
。
-
-
callback
-
err
-
data
|
-
fs.readFile('/text', (err, data) => {
if (err) throw err;
console.log(data);
});
同步:fs.readFileSync(path[, options])
写入文件内容
异步:fs.writeFile(file, data[, options], callback)
file
| | | 文件名或文件描述符。 data
| | | -
options
-
encoding
| 默认值: 'utf8'
。 -
mode
默认值: 0o666
。 -
flag
参阅支持的文件系统标志。默认值: 'w'
。
-
-
callback
-
err
-
const data = new Uint8Array(Buffer.from('Node.js中文网'));
fs.writeFile('文件.txt', data, (err) => {
if (err) throw err;
console.log('文件已保存');
});
同步:fs.writeFileSync(file, data[, options])
追加数据(文件不存在则创建)
异步:fs.appendFile(path, data[, options], callback)
path
| | | 文件名或文件描述符。 data
| -
options
-
encoding
| 默认值: 'utf8'
。 -
mode
默认值: 0o666
。 -
flag
参阅支持的文件系统标志。默认值: 'a'
。
-
-
callback
-
err
-
fs.appendFile('message.txt', '追加的数据', (err) => {
if (err) throw err;
console.log('数据已追加到文件');
});
//如果 options 是字符串,则它指定字符编码
fs.appendFile('message.txt1', '追加的数据', 'utf8', callback);
打开一个文件,并追加数据:
fs.open('message.txt', 'a', (err, fd) => {
if (err) throw err;
fs.appendFile(fd, '追加的数据', 'utf8', (err) => {
fs.close(fd, (err) => {
if (err) throw err;
});
if (err) throw err;
});
});
同步:fs.appendFileSync(path, data[, options]),使用方法同上
拷贝源文件到目标文件
异步:fs.copyFile(src, dest[, flags], callback)
-
src
| | 要拷贝的源文件名。 -
dest
| | 拷贝操作的目标文件名。 -
flags
用于拷贝操作的修饰符。默认值: 0
。 -
callback
const fs = require('fs');
// 默认情况下将创建或覆盖目标文件。
fs.copyFile('源文件.txt', '目标文件.txt', (err) => {
if (err) throw err;
console.log('源文件已拷贝到目标文件');
});
同步:fs.copyFileSync(src, dest[, flags]),使用同上
流的读写与输出
创建读写流:fs.createReadStream(path[, options])
path
| | -
options
| -
flags
参阅支持的文件系统标志。默认值: 'r'
。 -
encoding
默认值: null
。 -
fd
默认值: null
。 -
mode
默认值: 0o666
。 -
autoClose
默认值: true
。 -
start
-
end
默认值: Infinity
。 -
highWaterMark
默认值: 64 * 1024
。
-
返回:
参阅可读流。
从一个大小为 100 字节的文件中读取最后 10 个字节:
fs.createReadStream('sample.txt', { start: 90, end: 99 });
创建输出流:fs.createWriteStream(path[, options])
path
| | -
options
| -
flags
参阅支持的文件系统标志。默认值: 'w'
。 -
encoding
默认值: 'utf8'
。 -
fd
默认值: null
。 -
mode
默认值: 0o666
。 -
autoClose
默认值: true
。 -
start
-
返回:
参阅可写流。