fs模块是Node的一个内置模块,其中fs是File System的缩写,指的是文件系统。
同步的方法都有返回值,而异步的方法没有返回值,且参数都有一个回调函数。
介绍fs模块的方法前,先了解2个概念。
文件描述符fd
- 操作系统会为每个打开的文件分配一个名为文件描述符的数值标识,文件操作使用这些文件描述符来识别与追踪每个特定的文件。
- 在 NodeJS 中,每操作一个文件,文件描述符是递增的,文件描述符一般从
3
开始,因为前面有0
、1
、2
三个比较特殊的描述符,分别代表process.stdin
(标准输入)、process.stdout
(标准输出)和process.stderr
(错误输出)
标识符flag
NodeJS 中,flag代表着对文件的操作方式,如可读、可写等,不同的文件操作标识符有着不同含义。
- r 读取文件,如果文件不存在则抛出异常。read
- r+ 读取并写入文件,如果文件不存在则抛出异常。
- rs 读取并写入文件,指示操作系统绕开本地文件系统缓存。
- w 写入文件,文件不存在会被创建,存在则清空后写入。write
- wx 写入文件,排它方式打开。
- w+ 读取并写入文件,文件不存在则创建文件,存在则清空后写入。
- wx+ 和
w+
类似,排他方式打开。 - a 追加写入,文件不存在则创建文件。append
- ax 与
a
类似,排他方式打开。 - a+ 读取并追加写入,不存在则创建。
- ax+ 与
a+
类似,排他方式打开。
fs模块的4个基本的方法: 读取、写入、拷贝、删除。
1、文件读取
Node中文件读取的方式主要有:
同步读取:fs.readFileSync(file,[options])
同步读取文件readFileSync方法有两个参数
第一个参数为读取文件的路径或文件描述符。
第二个参数为 options,默认值为 null,其中有 encoding(编码,默认为 null)和 flag(标识位,默认为 r),也可直接传入 encoding。
返回值为文件的内容,如果没有 encoding
,返回的文件内容为 Buffer,如果有按照传入的编码解析。如下方当参数为‘utf8’时,会以utf8字符编码读取文件。
try {
const data = fs.readFileSync('demo01.txt', 'utf8');
console.log(data);
} catch(e) {
throw e;
}
异步读取:fs.readFile(file,[options], callback(error, data))
异步读取,该方法没有返回值,它的前两个参数与readFileSync
相同,最后一个参数为回调函数,函数内有两个参数 err
(错误)和 data
(数据),回调函数在读取文件成功后执行,第二个参数也可以不传,通过toString()方法解析返回的数据。
fs.readFile('demo01.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
2、文件写入
Node中文件写入的方式主要有:
同步写入:fs.writeFileSync(file, data[, options])
- 第一个参数为写入文件的路径或文件描述符;
- 第二个参数为写入的数据,类型为 String 或 Buffer;
- 第三个参数为
options
,默认值为null
,其中有encoding
(编码,默认为utf8
)、flag
(标识位,默认为w
)和mode
(权限位,默认为0o666
),也可直接传入encoding
。
const fs = require("fs");
fs.writeFileSync("./txt.txt", "Hello FS 你好");
let result = fs.readFileSync("./txt.txt", "utf8");
console.log(result); // Hello FS 你好
异步写入:fs.writeFile(file, data[, options], callback(error))
异步写入writeFile, 有四个参数
- 异步写入方法
writeFile
与writeFileSync
的前三个参数相同,最后一个参数为回调函数,函数内只有一个参数err
(错误),回调函数在文件写入数据成功后执行。
fs.writeFile('c:\\demo\a.txt', ‘hello,wolrd’, (error) => {
console.log(error);
});
文件追加
同步追加 appendFileSync
- 第一个参数为写入文件的路径或文件描述符;
- 第二个参数为写入的数据,类型为 String 或 Buffer;
- 第三个参数为
options
,默认值为null
,其中有encoding
(编码,默认为utf8
)、flag
(标识位,默认为a
)和mode
(权限位,默认为0o666
),也可直接传入encoding
const fs = require("fs");
fs.appendFileSync("./a.txt", "你好!");
let result = fs.readFileSync("./a.txt", "utf8");
console.log(result); // Hello FS 你好~
异步追加写入appendFile,有四个参数
异步追加写入方法 appendFile
与 appendFileSync
的前三个参数相同,最后一个参数为回调函数,函数内有一个参数 err
(错误),回调函数在文件追加写入数据成功后执行。
const fs = require("fs");
fs.appendFile("./a.txt", "2333", err => {
if(!err) {
fs.readFile("./a.txt", "utf8", (err, data) => {
console.log(data); // Hello FS 你好2333
});
}
});
3、 文件拷贝
同步拷贝:fs.copyFileSync(src, dest[, flags])
-
src
<string> | <Buffer> | <URL> 要拷贝的源文件名。 -
dest
<string> | <Buffer> | <URL> 拷贝操作的目标文件名。 -
flags
<number> 用于拷贝操作的修饰符。默认值:0
。
同步地将 src 拷贝到 dest。 默认情况下,如果 dest 已经存在,则覆盖它。 返回 undefined。
const fs = require('fs');
// 默认情况下将创建或覆盖目标文件。
fs.copyFileSync('源文件.txt', '目标文件.txt');
console.log('源文件已拷贝到目标文件');
异步拷贝:fs.copyFile(src, dest[, flags], callback)
与上面类似,异步拷贝比同步拷贝只是多了一个参数(回调函数)。
4、 文件删除
同步删除文件: fs.unlinkSync(path)
无返回值,unlinkSync
的参数为要删除文件的路径,如删除 node
目录下的 index.js
文件。
const fs = require("fs");
fs.unlinkSync("node/index.js");
异步删除文件: fs.unlink(path, callback)
unlink
方法的第一个参数与 unlinkSync
相同,最后一个参数为回调函数,函数中存在一个参数 err
(错误),在删除文件操作后执行。
const fs = require("fs");
fs.unlink("a/index.js", err => {
if (!err) console.log("删除成功");
});
fs.unlink()
不能用于目录。 要删除目录,则使用 fs.rmdir()
。
有关Node的fs模块,今天先分享到这,日后再更。
网友评论