Node常用内置模块

Node常用内置模块

path-内置模块

path模块的常用方法

(1)获取路径信息

const path = require('path');

// 1.获取路径的信息
const filepath = '/User/why/abc.txt';

console.log(path.dirname(filepath)); //获取路径名
console.log(path.basename(filepath)); //获取文件名
console.log(path.extname(filepath)); //获取文件的扩展名

(2)join实现路径的拼接

const basepath = '../User/why';
const filename = './abc.txt';

const filepath1 = path.join(basepath, filename);
console.log(filepath1);

(3)resolve实现路径的拼接

const basepath = '../User/why';
const filename = './abc.txt';
const othername = './why.js';

// resolve会判断拼接的路径字符串中,是否有以/或./或../开头的路径并且将所有的路径都进行一个打印
const filepath2 = path.resolve(basepath, filename, othername);
console.log(filepath2);

fs-内置模块

由于fs内置模块的api非常多,因此我们只学习常用的一些方法就行了,别的api可自己查询文档。

但是这些API大多数都会提供三种操作方式:

方式一:同步操作文件:代码会被阻塞,不会继续执行。

const fs = require('fs');

// 案例: 读取文件的信息(注意:只是提取文件信息)
const filepath = "./abc.txt";

// 1.方式一: 同步操作
const info = fs.statSync(filepath);
console.log("后续需要执行的代码");
console.log(info);

方式二:异步回调函数操作文件:代码不会被阻塞,需要传入回调函数,当获取到结果时,回调函数被执行。

// 2.方式二: 异步操作
fs.stat(filepath, (err, info) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log(info);
  console.log(info.isFile()); //是否是文件
  console.log(info.isDirectory()); //是否是文件夹
});
console.log("后续需要执行的代码");

方式三:异步Promise操作文件:代码不会被阻塞,通过fs.promises调用方法操作,会返回一个Promise,可以通过then、catch进行处理。

// 3.方式三: Promise
fs.promises.stat(filepath).then(info => {
  console.log(info);
}).catch(err => {
  console.log(err);
});

console.log("后续需要执行的代码");
操作文件

文件读取

(1) readFileSync(path,参数二):同步读取方法

  • 第二个参数为 options,默认值为 null,其中有 encoding(编码,默认为 null)和 flag(标识位,默认为 r),也可直接传入 encoding。
  • 返回值为文件的内容,如果没有 encoding,返回的文件内容为 Buffer二进制数据,如果有则按照传入的编码解析。
const fs = require("fs");

//同步读取数据
let buf = fs.readFileSync("1.txt");
let data = fs.readFileSync("1.txt", "utf8");

console.log(buf); // <Buffer 48 65 6c 6c 6f>
console.log(data); // Hello

(2) readFile(path,options,callback):异步读取方法

readFile 与 readFileSync 的前两个参数相同,最后一个参数为回调函数,回调函数内有两个参数 err(错误)和 data(数据),该方法没有返回值,回调函数在读取文件成功后执行。

const fs = require("fs");

//异步读取数据
fs.readFile("1.txt", "utf8", (err, data) => {
    console.log(err); // null
    console.log(data); // Hello
});

文件写入

(1) writeFileSync(path,参数二,options):同步写入方法

  • 第二个参数为写入的数据,类型为 String 或 Buffer。
const fs = require("fs");

//同步写入数据
fs.writeFileSync("2.txt", "Hello world");
let data = fs.readFileSync("2.txt", "utf8");

console.log(data); // Hello world

(2) writeFile(path,data,options,callback):异步写入方法

const fs = require("fs");

//异步写入数据
fs.writeFile("2.txt", "Hello world", err => {
    if (!err) {
        fs.readFile("2.txt", "utf8", (err, data) => {
            console.log(data); // Hello world
        });
    }
});

文件追加写入

(1) appendFileSync(path,data,options):同步追加写入方法

const fs = require("fs");

//同步追加写入
fs.appendFileSync("3.txt", " world");
let data = fs.readFileSync("3.txt", "utf8");

console.log(data); // Hello world

(2) appendFile(path,data,options,callback):异步追加写入方法

const fs = require("fs");

//异步追加写入
fs.appendFile("3.txt", " world", err => {
    if (!err) {
        fs.readFile("3.txt", "utf8", (err, data) => {
            console.log(data); // Hello world
        });
    }
});

文件拷贝写入

(1) copyFileSync(参数一,参数二):同步拷贝写入方法

参数一:第一个参数为被拷贝的源文件路径。

参数二:第二个参数为拷贝到的目标文件路径,如果目标文件不存在,则会创建并拷贝。

const fs = require("fs");

//文件同步拷贝写入
fs.copyFileSync("3.txt", "4.txt");
let data = fs.readFileSync("4.txt", "utf8");

console.log(data); // Hello world

(2) copyFile(src,des,callback):异步拷贝写入方法

const fs = require("fs");

//文件异步拷贝写入
fs.copyFile("3.txt", "4.txt", () => {
    fs.readFile("4.txt", "utf8", (err, data) => {
        console.log(data); // Hello world
    });
});

删除文件操作

(1) unlinkSync(filepath):同步删除文件方法

const fs = require("fs");

//同步删除文件
fs.unlinkSync("a/inde.js");

(2) unlink(filepath,callback):异步删除文件方法

const fs = require("fs");

//异步删除方法
fs.unlink("a/index.js", err => {
    if (!err) console.log("删除成功");
});

异步打开文件 open(path,flag,mode,callback)

const fs = require("fs");

//异步打开文件
fs.open("4.txt", "r", (err, fd) => {
    console.log(fd);
    fs.open("5.txt", "r", (err, fd) => {
        console.log(fd);
    });
});

// 3
// 4

异步关闭文件 close(fd,callback)

const fs = require("fs");

//异步关闭文件
fs.open("4.txt", "r", (err, fd) => {
    fs.close(fd, err => {
        console.log("关闭成功");
    });
});

// 关闭成功

异步读取文件 read

read 与 readFile 不同之处在于,read方法一般针对于文件太大,无法一次性读取全部内容到缓存中或文件大小未知的情况,都是多次读取到 Buffer 中。

read 方法中有六个参数:

  • fd:文件描述符,需要先使用 open 打开;
  • buffer:要将内容读取到的 Buffer;
  • offset:整数,向 Buffer 写入的初始位置;
  • length:整数,读取文件的长度;
  • position:整数,读取文件初始位置;
  • callback:回调函数,有三个参数 err(错误),bytesRead(实际读取的字节数),buffer(被写入的缓存区对象),读取执行完成后执行。
const fs = require("fs");
let buf = Buffer.alloc(6);

// 打开文件
fs.open("6.txt", "r", (err, fd) => {
    // 读取文件
    fs.read(fd, buf, 0, 3, 0, (err, bytesRead, buffer) => {
        console.log(bytesRead);
        console.log(buffer);

        // 继续读取
        fs.read(fd, buf, 3, 3, 3, (err, bytesRead, buffer) => {
            console.log(bytesRead);
            console.log(buffer);
            console.log(buffer.toString());
        });
    });
});

// 3
// <Buffer e4 bd a0 00 00 00>

// 3
// <Buffer e4 bd a0 e5 a5 bd>
// 你好
操作文件目录

查看文件目录的操作权限

(1) accessSync():同步查看

accessSync 方法传入一个目录的路径,检查传入路径下的目录是否可读可写,当有操作权限的时候没有返回值,没有权限或路径非法时抛出一个 Error 对象,所以使用时多用 try…catch… 进行异常捕获。

const fs = require("fs");

//同步查看
try {
    fs.accessSync("a/b/c");
    console.log("可读可写");
} catch (err) {
    console.error("不可访问");
}

(2) access(filepath,callback):异步查看

const fs = require("fs");

//异步查看
fs.access("a/b/c", err => {
    if (err) {
        console.error("不可访问");
    } else {
        console.log("可读可写");
    }
});

获取文件目录的 Stat 对象

文件目录的 Stat 对象存储着关于这个文件或文件夹的一些重要信息,如创建时间、最后一次访问的时间、最后一次修改的时间、文章所占字节和判断文件类型的多个方法等等。

(1) statSync(filepath):同步获取

const fs = require("fs");

//同步获取
let statObj = fs.statSync("a/b/c.txt");
console.log(statObj.size); // 6

(2) stat(filepath,callback):异步获取

const fs = require("fs");

//异步获取
fs.stat("a/b/c.txt", (err, statObj) => {
    console.log(statObj.size); // 6
});

创建文件目录

(1) mkdirSync(filepath):同步创建目录方法

mkdirSync 方法参数为一个目录的路径,没有返回值,在创建目录的过程中,必须保证传入的路径前面的文件目录都存在,否则会抛出异常。

const fs = require("fs");

// 假设已经有了 a 文件夹和 a 下的 b 文件夹
fs.mkdirSync("a/b/c");

(2) mkdir(filepath,callback):异步创建目录方法

const fs = require("fs");

// 假设已经有了 a 文件夹和 a 下的 b 文件夹
fs.mkdir("a/b/c", err => {
    if (!err) console.log("创建成功");
});

// 创建成功

读取文件目录

(1) readdirSync(filepath,options):同步读取文件目录

  • 返回值为一个存储文件目录中成员名称的数组。
const fs = require("fs");

//同步读取文件目录
let data = fs.readdirSync("a/b");
console.log(data); // [ 'c', 'index.js' ]

(2) readdir(filepath,options,callback):异步读取文件目录

const fs = require("fs");

//异步读取文件目录
fs.readdir("a/b", (err, data) => {
    if (!err) console.log(data);
});

// [ 'c', 'index.js' ]

删除文件目录

无论同步还是异步,删除文件目录时必须保证文件目录的路径存在,且被删除的文件目录为空,即不存在任何文件夹和文件。

(1) rmdirSync(filepath):同步删除文件目录

const fs = require("fs");

//同步删除文件目录
fs.rmdirSync("a/b");

(2) rmdir(filepath,callback):异步删除文件目录

const fs = require("fs");

//异步删除文件目录
fs.rmdir("a/b", err => {
    if (!err) console.log("删除成功");
});

// 删除成功

注意:flag选项

flag的值有很多:

(1)w 打开文件写入,写入时的默认值。

(2)w+ 打开文件进行读写,如果不存在则创建文件。

(3)r 打开文件读取,读取时的默认值。

(4)r+ 打开文件进行读写,如果不存在那么抛出异常。

(5)a 打开要写入的文件,将流放在文件末尾。如果不存在则创建文件。

(6)a+ 打开文件以进行读写,将流放在文件末尾。如果不存在则创建文件。

读取文件夹的所有文件

const fs = require('fs');
const path = require('path');

// 1.创建文件夹
const dirname = './why';

function getFiles(dirname) {
  fs.readdir(dirname, { withFileTypes: true }, (err, files) => {
    for (let file of files) {
      // fs.stat(file) 可以, 但是有点麻烦
      if (file.isDirectory()) {
        const filepath = path.resolve(dirname, file.name);
        getFiles(filepath);
      } else {
        console.log(file.name);
      }
    }
  });
}

getFiles(dirname);

文件的重命名

// 3.重命名
fs.rename("./why", "./kobe", err => {
  console.log(err);
})

events模块

events的常用方法

const EventEmitter = require("events");

// 1.创建事件发射器
const emitter = new EventEmitter();

// 2.监听某一个事件
// addListener是on的alias简写
emitter.on('click', (args) => {
  console.log("监听1到click事件", args);
})

const listener2 = (args) => {
  console.log("监听2到click事件", args);
}
emitter.on('click', listener2)

// 3.发出一个事件以及取消该事件
setTimeout(() => {
  emitter.emit("click", "coderwhy", "james", "kobe");
  emitter.off("click", listener2);
  emitter.emit("click", "coderwhy", "james", "kobe");
}, 2000);

events获取信息

const EventEmitter = require('events');

// 1.创建发射器
const emitter = new EventEmitter();

// 2.监听某一个事件
// addListener是on的alias简写
emitter.on('click', (args) => {
  console.log("监听1到click事件", args);
})

const listener2 = (args) => {
  console.log("监听2到click事件", args);
}
emitter.on('click', listener2)

emitter.on("tap", (args) => {
  console.log(args);
})

// 3.获取注册的事件
console.log(emitter.eventNames());
console.log(emitter.listenerCount("click"));
console.log(emitter.listeners("click"));

events不常用的方法

const EventEmitter = require("events");

// 1.创建发射器
const emitter = new EventEmitter();

// 2.监听某一个事件
// addListener是on的alias简写
// 只执行一次
emitter.once('click', (arg1, arg2, arg3) => {
  console.log("监听1到click事件", arg1, arg2, arg3);
})

const listener2 = function(arg1, arg2, arg3) {
  // 特点: 绑定this, 也不绑定arguments数组
  console.log(arguments);
  console.log(this);
  console.log("监听2到click事件", arg1, arg2, arg3);
}

emitter.on('click', listener2)

// 将本次监听放到最前面
emitter.prependListener('click', (arg1, arg2, arg3) => {
  console.log("监听3到click事件", arg1, arg2, arg3);
})

emitter.on("scroll", (args) => {
  console.log("监听到scroll方法");
})

// 3.发出一个事件
setTimeout(() => {
  // emitter.removeAllListeners("click");
  emitter.emit("click", "coderwhy", "james", "kobe");
  emitter.emit("click", "coderwhy", "james", "kobe");
  emitter.emit("scroll", "coderwhy", "james", "kobe");
}, 2000);

console.log(arguments);
console.log(this);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值