fs 文件系统模块
1.作用
fs(file system) 文件系统模块可以进行文件的创建、删除、重命名、移动, 文件内容的写入、读取, 以及文件夹的相关操作。
2.fs的异步和同步
fs 模块对文件的操作有异步和同步两种方式
区别:
- 同步调用会阻塞代码的执行,异步不会
- 异步调用会将读取任务下达到任务队列,直到任务执行完成才会回调,效率高
- 异常处理:同步必须要使用
try catch方式,异步可以使用回调函数的第一个参数 err 【重要】 - 语法方面:同步方法会比异步方法后面多上
Sync,例如:readFile()和readFileSync(),同步方法没有回调
3.文件的读取
在node中读取文件的方式有来两种,一个是利用fs模块,一个是利用流来读取。
- 如果读取小文件,我们可以使用fs读取,fs读取文件的时候,是将文件一次性读取到本地内存。
- 而如果读取一个大文件,一次性读取会占用大量内存,效率很低,这个时候需要用流来读取。
流是将数据分割段,一段一段的读取,可以控制速率,效率很高,不会占用太大的内存。gulp的task任务,文件压缩,和http中的请求和响应等功能的实现都是基于流来实现的。
3.1 readFile()
异步地读取一个文件的全部内容,文件的内容由回调函数中的data获取
js
fs.readFile(path[, options], callback)- path:
<string> | <Buffer> | <URL> | <integer>,要读取文件的路径 - options:
<Object> | <string>若不传参数,则读出的文件是buffer数据格式- 当参数为
Object时,有如下配置项- encoding:
<string> | <null>文件字符编码,一般传utf8,默认为null - flag:
<String>,参见 支持文件系统 flags,默认是r - signal:
<AbortSingal>允许中止正在进行的读取文件
- encoding:
- 当参数为
String时,传入的为encoding
- 当参数为
- callback:读取完成后的回调,有两个参数
- err:读取错误后的错误信息
- data:读取成功后的文件内容
示例
index.js
js
//text.txt内容为:12345,上山打老虎
const fs = require('fs');
// 指定字符格式
fs.readFile('./text.txt','utf8',(err,data)=>{
if(err){
console.log(err);
}else{
console.log(data); // 12345,上山打老虎
}
})
// 不指定字符格式
fs.readFile('./text.txt',(err,data)=>{
if(err){
console.log(err);
}else{
console.log(data);
// <Buffer 31 32 33 34 35 2c e4 b8 8a e5 b1 b1 e6 89 93 e8 80 81 e8 99 8e>
}
})
// 第二个参数为Object
fs.readFile(
'./text.txt',
{
encoding:'utf8',
flag:'r'
},
(err,data)=>{
if(err){
console.log(err);
}else{
console.log(data); // 12345,上山打老虎
}
})3.2 readFileSync()
同步地读取一个文件的全部内容,文件的内容由该函数的返回值获取
js
fs.readFileSync(path[, options])- path:
<string> | <Buffer> | <URL> | <integer>,要读取文件的路径 - options:
<Object> | <string>若不传参数,则读出的文件是buffer数据格式- 当参数为
Object时,有如下配置项- encoding:
<string> | <null>文件字符编码,一般传utf8,默认为null - flag:
<String>,参见 支持文件系统 flags,默认是r - signal:
<AbortSingal>允许中止正在进行的读取文件
- encoding:
- 当参数为
String时,传入的为encoding
- 当参数为
示例
js
// text.txt内容为:12345,上山打老虎
const fs = require('fs');
// 指定字符格式
const text=fs.readFileSync('./text.txt','utf8')
console.log(text); // 12345,上山打老虎
// 不指定字符格式
const text1=fs.readFileSync('./text.txt')
console.log(text1);
// <Buffer 31 32 33 34 35 2c e4 b8 8a e5 b1 b1 e6 89 93 e8 80 81 e8 99 8e>
// 第二个参数为Object
const text2=fs.readFileSync('./text.txt',{
encoding:'utf8',
flag:'r'
})
console.log(text2); // 12345,上山打老虎3.3 createReadStream()
- 创建一个读取流对象,默认不会读取数据,可使用该对象上的方法读取文件的内容
默认创建一个流 是非流动模式,默认不会读取数据
js
fs.createReadStream(path[, options])- path:
<string> | <Buffer> | <URL> - options:
<string> | <Object>- flags:
<String>,参见 支持文件系统 flags,默认是r - encoding:
<string> | <null>,文件字符编码,一般传utf8,默认为null - fd:
<integer> | <FileHandle>,默认值: null - mode:
<integer>,默认值: 0o666 - autoClose:
<boolean>,读取完毕后是否自动关闭,默认值: true - emitClose:
<boolean>,默认值: true - start:
<integer>,读取文件开始位置 - end:
<integer>,读取文件结束位置,默认值: Infinity - highWaterMark:
<integer>,文件一次读多少字节,默认 64*1024 - fs:
<Object> | <null>默认值: null - signal: <
AbortSignal> | <null>默认值: null
- flags:
- 返回:
<fs.ReadStream>
3.3.3 监听事件
常用的事件:
- open -打开文件
- data -当有数据可读时触发。
- error -在读收和写入过程中发生错误时触发。
- close -关闭文件
- end - 没有更多的数据可读时触发
监听事件的语法:
- 通过
fs.createReadStream()返回的流对象的的on方法监听
js
const fs = require('fs');
const rs = fs.createReadStream('./text.txt',{});
rs.on("open",()=>{
console.log("文件打开")
});
rs.on('data',(data)=>{
console.log(data);
});
rs.on("err",()=>{
console.log("发生错误")
});
rs.on('end',()=>{ //文件读取完毕后触发
console.log("读取完毕");
});
rs.on("close",()=>{ //最后文件关闭触发
console.log("关闭")
});3.3.4 暂停和恢复
- rs.pause() 暂停读取,会暂停data事件的触发,将流动模式转变非流动模式
- rs.resume() 恢复data事件,继续读取,变为流动模式
3.3.5 示例
js
// txt内容为1235,上山打老虎
const fs = require("fs");
const rs = fs.createReadStream("./text.txt", {
encoding: "utf8", //默认null
});
rs.on("open", () => {
console.log("文件打开");
});
rs.on("data", (data) => {
console.log(data);
});
rs.on("err", () => {
console.log("发生错误");
});
rs.on("end", () => {
//文件读取完毕后触发
console.log("读取完毕");
});
rs.on("close", () => {
//最后文件关闭触发
console.log("关闭");
});
// 依次打印
/*
文件打开
12345,上山打老虎
读取完毕
关闭
*/4.文件的写入
4.1 writeFile()
异步地写入数据到文件
- 如果文件已存在,则替代文件。
data可以是一个字符串或一个 buffer。 - 如果文件不存在,则创建文件并写入内容
js
fs.writeFile(file, data[, options], callback)- file:
<string> | <Buffer> | <URL> | <integer>,文件名或文件描述符 - data:
<string> | <Buffer> | <Uint8Array>,向文件里写入的内容- 如果
data是一个 buffer,则忽略encoding选项。它默认为'utf8'。
- 如果
- options:
<Object> | <string>,配置项- 当参数为
Object时,有如下配置项- encoding:
<string> | <null>,文件的字符集,默认 = 'utf8' - mode:
<integer>默认 = 0o666 - flag:
<string>默认为'w'
- encoding:
- 当参数为
string时,传入的为encoding
- 当参数为
- callback:
<Function>- err:
<Error>
- err:
示例
js
const fs = require("fs");
fs.writeFile('text.txt', '你好', (err) => {
if (err) throw err;
console.log('文件写入成功');
});4.2 writeFileSync()
向文件里同步写入内容,返回 undefined。
- 如果文件已存在,则替代文件。
data可以是一个字符串或一个 buffer。 - 如果文件不存在,则创建文件并写入内容
js
fs.writeFileSync(file, data[, options])- file:
<string> | <Buffer> | <URL> | <integer>文件名或文件描述符 - data:
<string> | <Buffer> | <Uint8Array>,向文件里写入的内容 - options:
<Object> | <string>,配置项- 当参数为
Object时,有如下配置项- encoding:
<string> | <null>,文件的字符集,默认 = 'utf8' - mode:
<integer>默认 = 0o666 - flag:
<string>默认为'w'
- encoding:
- 当参数为
string时,传入的为encoding
- 当参数为
示例
js
const fs = require("fs");
fs.writeFileSync('text.txt', '你好');4.3 appendFile()
异步地追加数据到一个文件,如果文件不存在则创建文件。 data 可以是一个字符串或 Buffer。
js
fs.appendFile(file, data[, options], callback)- file:
<string> | <Buffer> | <URL> | <integer>,文件名或文件描述符 - data:
<string> | <Buffer> | <Uint8Array>,向文件里写入的内容- 如果
data是一个 buffer,则忽略encoding选项。它默认为'utf8'。
- 如果
- options:
<Object> | <string>,配置项- 当参数为
Object时,有如下配置项- encoding:
<string> | <null>,文件的字符集,默认 = 'utf8' - mode:
<integer>默认 = 0o666 - flag:
<string>默认为'a'
- encoding:
- 当参数为
string时,传入的为encoding
- 当参数为
- callback:
<Function>- err:
<Error>
- err:
示例
js
// text.txt内容为:12345
const fs = require("fs");
fs.appendFile('text.txt', ',上山打老虎','utf8',(err)=>{});
console.log(fs.readFileSync('text.txt')) // 12345,上山打老虎4.4 appendFileSync()
同步地追加数据到一个文件,如果文件不存在则创建文件。 data 可以是一个字符串或 Buffer。
js
fs.appendFileSync(file, data[, options])- file:
<string> | <Buffer> | <URL> | <integer>,文件名或文件描述符 - data:
<string> | <Buffer> | <Uint8Array>,向文件里写入的内容- 如果
data是一个 buffer,则忽略encoding选项。它默认为'utf8'。
- 如果
- options:
<Object> | <string>,配置项- 当参数为
Object时,有如下配置项- encoding:
<string> | <null>,文件的字符集,默认 = 'utf8' - mode:
<integer>默认 = 0o666 - flag:
<string>默认为'a'
- encoding:
- 当参数为
string时,传入的为encoding
- 当参数为
示例
js
// text.txt内容为:12345
const fs = require("fs");
fs.appendFileSync('text.txt', ',上山打老虎','utf8',(err)=>{});
console.log(fs.readFileSync('text.txt')) // 12345,上山打老虎4.5 createWriteStream()
4.5.1 作用
4.5.2 语法
4.5.3 示例
5.文件重命名
5.1 rename()
js
fs.rename(oldPath, newPath, callback)示例
5.2 renameSync()
js
fs.renameSync(oldPath, newPath)示例
5.3 移动文件
6.操作文件夹
6.1 mkdir()
js
fs.mkdir(path[, mode], callback)示例
6.2 mkdirSync()
js
fs.mkdirSync(path[, mode])示例
6.3 readdir()
js
fs.readdir(path[, options], callback)示例
6.4 readdirSync()
js
fs.readdirSync(path[, options])示例
6.5 rmdir()
js
fs.rmdir(path, callback)示例
6.6 rmdirSync()
js
fs.rmdirSync(path)示例
