4.9 KiB
这篇文章是 Working with file system paths on Node.js 学习过程中的个人总结和笔记,大部分内容实际来自于原文章,如果你对 Nodejs 中的文件系统 (path) 感兴趣,我更建议你直接去看原文章。
在下文中 path 会被翻译成 路径
Nodejs 中路径相关(Path-related)的功能
- 大多数路径相关的功能都在模块
node:path
中 - 全局变量
process
拥有一些方法可以改变当前工作目录(current working directory) node:os
模块拥有一些函数可以返回重要的目录路径
关于 path
的使用有三种方法,它们分辨是
- 直接使用
path
- 使用平台特定版本(platform-specific versions)相关的
path
:path.posix
对应 Unix 系系统,包括 MacOSpath.win32
对应 Windows 系统
而直接使用 path
本身,它本身始终支持当前平台,内部似乎做了一些判断,可以从下面 Nodejs REPL 的例子中看出来:
path.parse === path.posix.parse // true
不同的 path
特定版本的处理逻辑也会有不同,如果没有使用正确的版本,可能会出现预期之外的结果
基本路径概念及其API支持
当前工作目录 current working directory(CWD)
- 如果我们使用一个包含相对路径的命令(command),该路径将针对 CWD 进行解析
- 如果我们在省略了一个路径的期望路径(就是不传),那么这时候会使用 CWD
- 在 UNIX 和 Windows 中切换 CWD 的命令都是
cd
process
是 Nodejs 提供的全局变量,它为我们提供了一些用于获取(getting)或设置(setting)CWD 的方法:
process.cwd()
会返回当前 CWDprocess.chdir(dirPath)
改变当前 CWD 至dirPath
- 在
dirPath
必须有一个路径 - 改变并不会影响 shell,只影响当前运行的 Nodejs 进程
- 在
当路径不完整(isn’t fully qualified)的时候,Nodejs 会使用 CWD 来填补缺失的部分
在 Windows 中的当前工作目录(CWD)
在 Windows 系统中,CWD 的工作会有些许不同:
- 每个驱动器都有一个 CWD
- 有一个当前驱动器(current drive)存在
我们可以使用 path.chdir()
同时修改两者:
process.chdir('C:\\Windows');
process.chdir('Z:\\tmp');
但是当我们重新访问一个驱动器的时候,Nodejs 会记住当前驱动器的前一个当前目录:
process.cwd() // 'Z:\\tmp'
process.chdir('C:');
process.cwd() // 'C:\\Windows'
完整路径和不完整路径以及路径解析
- 一个完整路径(fully qualified path)不依赖于任何信息,可以原样使用
- 一个不完整的路径(partially qualified path)是缺少信息的,在使用之前我们需要将其解变成一个完整路径
Unix
Unix 只知道两种路径:
- 绝对路径(Absolute paths):是一个完整路径,总是以斜杠开头:
/home/user/video
- 相对路径(Relative paths):是一个不完整的路径,会以文件名或是点(dot)开头:
dir
../dir
使用 path.resolve()
在 Unix 中解析路径非常的简单,其返回会是一个绝对路径
Windows
在 Windows 中有四种路径:
- 绝对路径和相对路径
- 以上两种路径都可以带卷标和不带卷标
带卷标(drive letter)的绝对路径才是一个完整路径,而其他都是不完整路径,在 Windows 中使用 path.resolve
解析路径,规则会比较复杂,详情可以看原文章,这里就不贴出来了
通过 node:os
模块获取重要目录的路径
模块 "node:os "为我们提供了两个重要目录的路径
os.homedir()
返回当前用户的主目录路径os.tmpdir()
返回当前操作系统的临时文件目录路径
路径拼接(concatenating paths)
有两个方法用于路径拼接:
path.resolve()
总是返回一个完整路径path.join()
则会保留相对路径
path.resolve()
可以把 path.resolve
的行为总结为以下的几点:
- 从当前工作目录(CWD)开始拼接
- 将 path[0] (参数0)与之前的结果进行比对
- 将 path[1] (参数1)与之前的结果进行比对
- 对所有剩余的路径参数做同样的处理
- 返回完整的路径
在上边我们已经知晓了它的行为,下面这些结果也印证了上面的总结
- 当参数为空时,会返回当前的工作目录路径(CWD)
path.resolve() // ""
- 当有一个或多个相对路径时,将会从当前工作路径(CWD)开始拼接
- 当参数中有完整路径时,始终会覆盖前一个拼接结果