Node 文件和系统操作

文件操作常用模块

  • 内置模块fspath

  • fs-extra: 一个用于扩展 Node.js 内置的 fs 模块的模块,提供了更多的功能和更方便的 API,例如拷贝、删除、压缩等操作。

  • glob: 用于匹配文件路径模式的模块,可以查找符合特定模式的文件和目录,支持通配符和正则表达式。

  • chokidar: 一个用于监听文件变化的模块,支持多种事件,例如文件创建、修改、删除等。

  • rimraf: 一个用于删除文件和目录的模块,类似于 Unix 的 rm 命令,但更加强大和易用。

  • mkdirp: 一个用于创建目录的模块,可以递归地创建多级目录,类似于 Unix 的 mkdir -p 命令。

  • ncp: 一个用于复制文件和目录的模块,支持递归复制、过滤文件等功能。

  • tar: 一个用于打包和解包 tar 文件的模块,可以处理单个文件或整个目录,并支持多种压缩格式。

node 文件路径

环境变量:

  • __dirname:返回正在执行文件的目录,的绝对路径,/Users/project/src/utils/

  • __filename:返回正在执行文件的文件名,的绝对路径,/Users/project/src/utils/test.js

  • process.cwd():返回当前工作目录,调用命令的主目录,/Users/project/

TIP

__dirname__filename 获取的是当前模块文件所在的目录路径和文件路径,主要用于模块内部的文件操作。而 process.cwd() 获取的是 Node.js 进程的当前工作目录,主要用于全局的文件操作。

__dirname__filename这两个变量通常用于读取、加载当前模块文件所在的其他文件,例如读取配置文件、加载中间件等。可以确保我们使用的路径是正确的,并且不受运行环境的影响。

此外,由于 Node.js 使用的是 Unix 风格的路径分隔符(/),因此在 Windows 平台上使用时,需要注意路径分隔符的转换。

path 模块

path 模块提供了一些方法,用于处理文件路径和目录路径,例如获取路径的各个部分、解析路径、拼接路径、判断路径是否为绝对路径等。

  • path.join('/User', '/bin', '...'):将多个路径拼接为一个路径(可以是相对路径或绝对路径)

  • path.resolve():将多个路径解析为一个绝对路径

  • path.relative():返回相对路径

  • path.basename(path):返回路径的最后一部分,即文件名或目录名

  • path.dirname(path):返回路径中的目录部分

  • path.extname(path):返回路径中文件的扩展名,包括.符号

  • path.parse(dir):解析路径为对象结构

join 和 resolve

path.join() 方法将多个路径参数拼接在一起,生成一个新的路径字符串;而 path.resolve() 方法将多个路径参数解析为一个绝对路径。

如果要拼接多个路径,而且路径中包含相对路径,那么可以使用 path.join();如果需要将相对路径解析为绝对路径,可以使用 path.resolve()。

判断当前目录是否为空

// 获取当前目录
const localPath = process.cwd();

// 获取当前目录下所有文件列表
const fileList = fs.readdirSync(localPath);

// [] 返回一个数组
console.log(fileList);
1
2
3
4
5
6
7
8

文件目录操作

创建新目录

使用__dirname创建新目录

const fs = require('fs');
const path = require('path');
const dirPath = path.join(__dirname, '/pictures');

fs.mkdirSync(dirPath);
1
2
3
4
5

将文件添加到现有目录

openSync()如果您的目录中不存在该文件,则使用该方法将添加该文件。

const fs = require('fs');
const path = require('path');
const filePath = path.join(__dirname, '/pictures');

fs.openSync(filePath, 'hello.jpeg');
1
2
3
4
5

文件操作

读取文件-redadFile

const fs = require('fs').promises;

async function redadFile(filePath) {
  try {
    const bufferData = await fs.readFile(filePath);
    console.log(bufferData.toString());
  } catch (error) {
    console.error(error.message);
  }
}
redadFile('test.txt');
1
2
3
4
5
6
7
8
9
10
11

写入文件-writeFile

如果没有该文件,Node.js 将会创建当前文件。

第三个参数{ flag: 'a' },告诉 Node.js 追加到文件,而不是覆盖它。 如果您不指定标志,则默认为 'w',如果文件不存在则创建一个新文件,如果文件已存在则覆盖该文件。

const fs = require('fs').promises;

async function writeFile(filePath, data) {
  try {
    await fs.writeFile(filePath, data, { flag: 'a' });
  } catch (error) {
    console.error(error.message);
  }
}
1
2
3
4
5
6
7
8
9
const fs = require('fs').promises;

async function deleteFile(filePath) {
  try {
    await fs.unlink(filePath);
    console.log(`Deleted ${filePath}`);
  } catch (error) {
    console.error(error.message);
  }
}
1
2
3
4
5
6
7
8
9
10

警告

当您使用该功能删除文件时 unlink(),它不会被发送到您的回收站或垃圾桶,而是从您的文件系统中永久删除。此操作不可逆!

移动文件-rename

rename()函数有两个参数:源文件路径和目标文件路径。此功能可以将文件移动到其他文件夹,在当前目录中重命名文件,或者同时移动和重命名

const fs = require('fs').promises;

async function moveFile(source, destination) {
  try {
    fs.rename(source, destination);
  } catch (error) {
    console.error(error.message);
  }
}

moveFile('test.txt', '/data/rename.txt');
1
2
3
4
5
6
7
8
9
10
11

stream 流操作

  • 参考慕课网课程 Node.js 开发 webServer 博客项目,资源在网盘里

stream 是一种处理数据的抽象概念,可以将数据分成“块”或“流”,然后逐个处理。不必一次性把所有数据读取到内存中或一次性把所有数据写入到目标中。它可以让你在处理大型数据集变得更加高效和可靠。

使用 Stream 的优点是可以减少内存的占用,提高数据的处理速度。(提高内存效率和时间效率)

在 Stream 中,有四种基本的数据流:

  • 可读流(Readable)
  • 可写流(Writable)
  • 双工流(Duplex)
  • 转换流(Transform)

可读流提供了一种读取数据的方式,可写流提供了一种写入数据的方式,双工流同时支持读取和写入数据,而转换流可以通过读取输入数据并转换它们来产生输出数据。

当使用 Stream 时,数据可以通过管道(pipe)来传输,这使得数据可以在不同的 Stream 之间自由地流动。

主要用途

  • 文件读写操作:使用 fs 模块中的 fs.createReadStream()和 fs.createWriteStream()

  • 网络通信:HTTP 请求和响应通常是一个流,可以将请求体和响应体分成多个数据块进行处理

  • 数据转换:通过使用流,可以将一种格式的数据转换为另一种格式

  • 压缩文件

示例

从文件中读取数据:

const fs = require('fs');

const readStream = fs.createReadStream('input.txt');

readStream.on('data', (chunk) => {
  console.log(chunk);
});

readStream.on('end', () => {
  console.log('读取完毕');
});

readStream.on('error', (err) => {
  console.error(err);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

使用 HTTP 模块处理请求和响应:

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  req.pipe(res);
});

server.listen(3000);
1
2
3
4
5
6
7
8
Last Updated: 2023/3/20 13:48:48
Contributors: licong96