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;
});
});
const fs = require('fs');
const fileUrl = new URL('file:///tmp/hello');
fs.readFileSync(fileUrl);
创建目录
异步:fs.mkdir(path[, options], callback)
-
callback
<Function>-
err
<Error>
-
// 创建 /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)
-
callback
<Function>-
err
<Error> -
files
<string[]> | <Buffer[]> | <fs.Dirent[]>
-
同步:fs.readdirSync(path[, options])
打开关闭文件
打开:
异步:fs.open(path, flags[, mode], callback)
mode
<integer> 默认值:0o666
(可读写)。-
callback
<Function> 同步:fs.openSync(path, flags[, mode])
关闭:
- 异步:fs.close(fd, callback)
- 同步:fs.closeSync(fd)
读取文件全部内容
异步:fs.readFile(path[, options], callback)
-
callback
<Function>
fs.readFile('/text', (err, data) => {
if (err) throw err;
console.log(data);
});
同步:fs.readFileSync(path[, options])
写入文件内容
异步:fs.writeFile(file, data[, options], callback)
data
<string> | <Buffer> | <TypedArray> | <DataView>-
callback
<Function>-
err
<Error>
-
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)
-
callback
<Function>-
err
<Error>
-
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
<string> | <Buffer> | <URL> 要拷贝的源文件名。 -
dest
<string> | <Buffer> | <URL> 拷贝操作的目标文件名。 -
flags
<number> 用于拷贝操作的修饰符。默认值:0
。 -
callback
<Function>
const fs = require('fs');
// 默认情况下将创建或覆盖目标文件。
fs.copyFile('源文件.txt', '目标文件.txt', (err) => {
if (err) throw err;
console.log('源文件已拷贝到目标文件');
});
同步:fs.copyFileSync(src, dest[, flags]),使用同上
流的读写与输出
创建读写流:fs.createReadStream(path[, options])
返回: <fs.ReadStream> 参阅可读流。
从一个大小为 100 字节的文件中读取最后 10 个字节:
fs.createReadStream('sample.txt', { start: 90, end: 99 });