Node.js path模块:文件路径

概述

读了 path 模块的文档,研究了几个有意思的问题:

  • 🤔️ 路径片段分隔符 vs 路径定界符
  • 🤔️ path.join() vs path.resolve()
  • 🤔️ Windows vs Posix

路径片段分隔符 vs 路径定界符

path.sep,是路径片段分隔符。它在 Windows 上是\,在 Unix 上是/。它用于指定文件(夹)的路径中。

path.delimiter,是路径定界符。它在 Windows 上是 ;,在 Unix 上是:。它用于分割多个路径。因为在系统变量里,多个路径是被拼接为一个字符串存储(不是数组集合)。

例如,如果想获取所有可执行程序的搜索路径,代码如下:

1
2
3
4
5
6
7
8
const path = require("path");
/**
* @return {string[]}
*/
function getAllPaths() {
const paths = process.env.PATH.split(path.delimiter);
return paths;
}

path.join() vs path.resolve()

两者的相同点是:都会使用系统的分隔符将“路径片段”进行拼接。

两者的不同点在于:path.join()只是拼接路径,**path.resolve()******** 会将拼接好的路径转换成绝对路径**。

1
2
3
4
const path = require("path");
console.log("工作目录是:", process.cwd());
console.log("当前工作目录下的tmp.js路径", path.join(".", "tmp.js"));
console.log("当前工作目录下的tmp.js绝对路径", path.resolve(".", "tmp.js"));

上面这段代码的的结果是:

1
2
3
工作目录是: /Users/yuanxindong/Desktop/articles/xxoo521
当前工作目录下的tmp.js路径 tmp.js
当前工作目录下的tmp.js绝对路径 /Users/yuanxindong/Desktop/articles/xxoo521/tmp.js

Windows vs Posix

POSIX: Portable Operating System Interface,可移植操作系统接口。是 IEEE 为要在各种 UNIX 操作系统上运行软件,而定义 API 的一系列互相关联的标准的总称。Linux 基本实现 POSIX 兼容,Windows 部分实现。(来源:维基百科:可移植操作系统接口

Posix 的主要目的是在源码层面提供给开发者统一的操作系统 API。它本身是一个规范,但是系统没保证一定落实(类似 ES6 规范和 IE 的关系)。

由于在 Windows 和 Posix 上,针对 path 的一些规范不相同(例如分隔符),所以相同的 api+相同的参数,在两种平台上的调用结果可能不一样。

为了解决这个问题,nodejs 也提供了path.win32path.posix来解决这个问题。

例如,我在我的 mac 上想解析一段 windows 路径格式的数据,拿到它的 basename。代码如下:

1
2
3
const path = require("path");
console.log(path.basename("C:\\temp\\myfile.html")); // output: C:\temp\myfile.html
console.log(path.win32.basename("C:\\temp\\myfile.html")); // output: myfile.html

对比结果,第一种是错误的,因为本机是 mac。这两种接口,在处理跨平台的文件路径时候,有很大作用。

参考链接