一、核心模块fs
1、文件读取
使用 Node 中 提供的 文件操作API,读取指定 文件中的文本内容
- Node 的三个组成部分: ECMAScript 核心 + 全局成员 + 核心API成员
- 核心API成员 ,在安装 Node 应用程序的时候,就已经安装到了 自己的 电脑中;
- 如果想要访问 核心成员,直接使用 require('核心成员的名称') 就能够导入并使用这些核心成员;
1.1. 导入 fs 文件操作模块
const fs = require('fs');
fs 核心模块中,提供了一个 fs.readFile 方法,来读取指定目录下的文件
fs.readFile()
2.2. 调用 fs.writeFile 写入文件
fs.readFile 有三个参数:
参数1: 表示 要读取的文件的路径
参数2: 表示 要以什么样的编码格式,来读取指定的文件 默认 编码格式为 null
参数3: 表示 当文件读取完成,调用这个 callback 回调函数来处理读取的结果:
第一个 参数,是 Error 对象,第二个参数,才是读取成功的结果
fs.readFile('./files/1.txt', 'utf-8', function(err, data) {
if (err) return console.log('读取文件失败:' + err.message);
console.log('读取文件成功,内容是' + data);
})
2、文件写入
调用 fs.writeFile 方法,将内容 写入指定文件中
2.1. 导入 fs 文件操作模块
const fs = require('fs')
2.2. 调用 fs.writeFile 写入文件
参数1: 路径字符串,表示要把文件内容,写入到哪个文件中
参数2: 要写入的数据,可以给定一个 字符串
参数3: 可选参数,表示 要以什么格式写入文件内容 默认以 utf8 格式写入文件【一般默认不传递第三个参数】
参数4: 文件写入完成之后的 callback 回调函数 ,在回调函数中,只有一个形参,err 错误对象
fs.writeFile('./files/2.txt', '222', (err) => {
// 如果文件写入失败,则报错
if (err) return console.log('写入文件失败!' + err.message);
console.log('文件写入成功!');
})
如果在使用 fs.writeFile 的时候,要写入的文件不存在,则直接写入;如果要写入的文件路径已经存在,则会覆盖之前的文件;
3、文件追加
3.1. 导入 fs 文件操作模块
const fs = require('fs')
3.2. 调用 fs.appendFile 追加文件内容
参数1: 表示要向哪个文件中追加内容,指定一个文件的路径
参数2: 表示要追加的具体的内容,可以传递字符串内容
参数3: 可选参数;表示 追加文本内容时候的编码格式,如果省略此参数,默认以 utf8 的格式追加内容
参数4: 表示 追加完成之后的回调,有形参 err ,追加失败之后的错误结果
fs.appendFile('./files/3.txt', '\n333', (err) => {
if (err) return console.log('追加文件失败!' + err.message);
console.log('追加文件成功!');
})
如果要追加的文件路径不存在,则会先尝试创建这个文件,然后再向创建的文件中,追加具体的内容;
4、__dirname
在node的js代码中使用相对路径 ,有时候会出现找不到文件的问题,这是因为在node中计算相对路径与web中不一样,web是相对于项目根目录计算路径,node中是相对于终端运行目录去计算的。
ENOENT: no such file or directory, open 'C:\Users\xxx\files\1.txt'
__dirname :表示当前执行 js文件 的 所属目录 的 绝对路径,注意是目录 ,通过拼接可以获得要操作文件的绝对路径。
之前写的追加示例代码可以替换成:
fs.appendFile(__dirname + '/files/3.txt', '\n333', (err) => {
if (err) return console.log('追加文件失败!' + err.message);
console.log('追加文件成功!');
})
在使用 fs 模块操作文件,且这个方法需要提供文件的路径,一定要使用 __dirname 去拼接路径;
5、__filename
__dirname :表示 当前执行js文件 的 绝对路径 。
6、fs-获取指定路径的信息
语法:
fs.stat(path,callback);
fs.stat(__dirname + '/files/1.txt', (err, stats) => {
if (err) return console.log(err.message);
console.log(stats.size); // 字节(Byte)
console.log(stats.birthtime); // 2018-06-07T10:19:11.186Z 零时区
console.log(stats.isFile()); // isFile() 判断是否为 文件
console.log(stats.isDirectory()); // isDirectory() 判断是否为目录
})
7、复制文件
语法
fs.copyFile(oldPath,newPath,callback)
fs.copyFile(__dirname + '/files/1.txt', __dirname + '/files/1-copy.txt', (err) => {
if (err) return console.log('拷贝失败:' + err.message);
console.log('拷贝成功!');
})
如果目标文件已存在,则覆盖。
二、核心模块path
1、path路径模块基本用法
path.join()
导入path模块
const path = require("path");
path.join() 每个参数相对于前一个参数进行规范化拼接。
识别../ 和 ./ ,可以和终端一样返回上一级或当前目录
例如:
path.join("/foo","bar","baz/asdf","quux","..");
// 返回值为:"/foo/bar/baz/asdf"
const path = require('path'); //导入 path 模块
const fs = require('fs'); //导入 fs 模块
const result = path.join('c:/', 'a', './b', '/c', './d/e', 'f', '../g');
console.log(result); // c:\a\b\c\d\e\g
// 手动拼接路径
fs.readFile(__dirname + '/files/1.txt', 'utf8', (err, dataStr) => {
if (err) return console.log(err.message);
console.log(dataStr);
});
// path.join() 拼接路径
fs.readFile(path.join(__dirname, '/files/1.txt'), 'utf8', (err, dataStr) => {
if (err) return console.log(err.message);
console.log(dataStr);
});
以后只要涉及到路径拼接,一定要使用 path.join() 方法
2、其他用法
- path.sep 路径分隔符
- path.basename(str) 获取文件名称
- path.dirname(str) 获取文件所在的路径
- path.extname(str) 获取文件的扩展名
const path = require('path');
// console.log(path.sep); // 路径分隔符
const str = 'c:/a/b/c/1.txt';
console.log(path.basename(str)); // 获取文件名称 1.txt
console.log(path.dirname(str)); // 获取文件所在路径 c:/a/b/c
console.log(path.extname(str); // 获取文件的扩展名 .txt