/ 前端工程

Node.js path 模块 API 快速索引

Node.js path 模块 API 快速索引

Node.js 版本 v10.7.0

本文为 path 模块 API 的基本介绍和快速说明,用于学习和速查。

目录

Path

Windows vs. POSIX

由于在 Windows 系统中和 POSIX 的系统中,路径风格是不同的,所以同样的 API 表现可能会不一样,例如 path.basename('C:\\temp\\myfile.html'); 在 POSIX 的系统中会得到 'C:\\temp\\myfile.html',而在 Windows 中会得到 'myfile.html'。因此为了保持一致性,提供了两个"命名空间",分别是 path.win32path.posix,顾名思义,他们可以分别将接口的风格统一成 Windows 风格和 POSIX 风格。

使用示例:

path.win32.basename('C:\\temp\\myfile.html');
// Returns: 'myfile.html'

path.posix.basename('/tmp/myfile.html');
// Returns: 'myfile.html'

path.basename(path[, ext])

basename() 返回路径的最后一部分。当参数 path 是一个文件的路径时,返回文件名;当参数 path 是一个目录的路径时,返回目录名。此外 basename 方法可以传入第二个"文件扩展名参数",用于在第一参数传入文件路径时去除文件名扩展名。

使用示例:

path.basename('/foo/bar/baz/asdf/quux.html');
// Returns: 'quux.html'

path.basename('/foo/bar/baz/asdf/quux.html', '.html');
// Returns: 'quux'

path.basename('/foo/bar/baz/asdf/quux.html', '.h');
// Returns: 'quux.html', bacause current extension is not .h

path.basename('/foo/bar/baz/asdf/')
// Returns: 'asdf'

path.delimiter

delimiter 是当前系统中的多个路径的定界符(例如环境变量 PATH 中的定界符)。

在 Windows 系统中: ;
在 POSIX 的系统中: :

使用示例:

在 Windows 系统中:

console.log(process.env.PATH);
// Prints: 'C:\Windows\system32;C:\Windows;C:\Program Files\node\'

process.env.PATH.split(path.delimiter);
// Returns ['C:\\Windows\\system32', 'C:\\Windows', 'C:\\Program Files\\node\\']

在 POSIX 的系统中:

console.log(process.env.PATH);
// Prints: '/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin'

process.env.PATH.split(path.delimiter);
// Returns: ['/usr/bin', '/bin', '/usr/sbin', '/sbin', '/usr/local/bin']

path.dirname(path)

dirname() 返回目录路径,忽略尾部的路径分隔符(path.sep)。

使用示例:

path.dirname('/foo/bar/baz/asdf/quux');
// Returns: '/foo/bar/baz/asdf'

path.dirname('/foo/bar/baz/asdf/quux.html');
// Returns: '/foo/bar/baz/asdf'

path.dirname('/foo/bar/baz/asdf/quux/');
// Returns: '/foo/bar/baz/asdf'

path.extname(path)

extname() 返回 basename 中从最后一个.到结尾的字符串,并且最后一个.不能是 basename 的开头,如果不能得到(RegExp: /\..*/)形式的结果,就返回空字符串。

使用示例:

path.extname('index.coffee.md');
// Returns: '.md'

path.extname('index.');
// Returns: '.'

path.extname('index.   ');
// Returns: '.   '

path.extname('index');
// Returns: ''

path.extname('.index');
// Returns: ''

path.extname('   .index');
// Returns: '.index'

path.format(pathObject)

  • pathObject <Object>
    • dir <string>
    • root <string>
    • base <string>
    • name <string>
    • ext <string>
  • Returns: <string>

format() 通过一个对象生成路径字符串,与 path.parse 相反。

  • 当 pathObject.dir 存在时,pathObject.root 被忽略
  • 当 pathObject.base 存在时,pathObejct.ext 和 pathOject.name 被忽略

使用示例:

// `root` is ignored
path.format({
  root: '/ignored',
  dir: '/home/user/dir',
  base: 'file.txt'
});
// Returns: '/home/user/dir/file.txt'

// `ext` is ignored
path.format({
  root: '/',
  base: 'file.txt',
  ext: 'ignored'
});
// Returns: '/file.txt'

// `name` + `ext` will be used if `base` is not specified.
path.format({
  root: '/',
  name: 'file',
  ext: '.txt'
});
// Returns: '/file.txt'

path.isAbsolute(path)

path.isAbsolute 判断传入路径是否是绝对路径

path.join([...paths])

join() 按照传入的路径拼接得到最终路径。当最终 join 出来的 path 为空字符串时,得到 .,表示当前目录。

使用示例:

path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// Returns: '/foo/bar/baz/asdf'

path.join('foo', {}, 'bar');
// throws 'TypeError: Path must be a string. Received {}'

path.normalize(path)

normalize() 将 path 规范化并且进行 resolve。

使用示例:

path.normalize('/foo/bar//baz/asdf/quux/..');
// Returns: '/foo/bar/baz/asdf'

ath.win32.normalize('C:////temp\\\\/\\/\\/foo/bar');
// Returns: 'C:\\temp\\foo\\bar'

path.parse(path)

parse() 将路径字符串解析成路径对象,与 format 相反。

使用示例:

path.parse('/home/user/dir/file.txt');
// Returns:
// { root: '/',
//   dir: '/home/user/dir',
//   base: 'file.txt',
//   ext: '.txt',
//   name: 'file' }
┌─────────────────────┬────────────┐
│          dir        │    base    │
├──────┬              ├──────┬─────┤
│ root │              │ name │ ext │
"  /    home/user/dir / file  .txt "
└──────┴──────────────┴──────┴─────┘

path.posix

posix 为 POSIX 的系统的接口命名空间,其中实现了 POSIX 风格的 path API

path.relative(from, to)

relative() 返回从 from 到 to 的相对路径,如果 fromto 中存在空字符串,则其空值会被当前目录所代替。

使用示例:

path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb');
// Returns: '../../impl/bbb'

path.resolve([...paths])

resolve() 类似于 linux 中的 cd,从第一个传入的 path 参数开始 cd,一个个 cd 过去,得到的最终目录就是返回值。与 cd 的不同之处在于 path.resolve() 可以 resolve 到文件,而 cd 只对目录有效。

使用示例:

path.resolve('/foo/bar', './baz');
// Returns: '/foo/bar/baz'

path.resolve('/foo/bar', '/tmp/file/');
// Returns: '/tmp/file'

path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif');
// if the current working directory is /home/myself/node,
// this returns '/home/myself/node/wwwroot/static_files/gif/image.gif'

path.sep

sep 为路径的分隔符。

在 Windows 系统中: \\
在 POSIX 的系统中: /

使用示例:

在 Windows 系统中:

'foo\\bar\\baz'.split(path.sep);
// Returns: ['foo', 'bar', 'baz']

在 POSIX 的系统中:

'foo/bar/baz'.split(path.sep);
// Returns: ['foo', 'bar', 'baz']

path.toNamespacedPath(path)

转换成 namespace-prefixed 路径。只在 windows 有效,其他系统直接返回,相关信息: namesapces

path.win32

win32 为 Windows 系统的接口命名空间,其中实现了 Windows 风格的 path API

path.join 和 path.resolve 的区别

path.joinpath.resolve

这两个 API 看起来有点像,区别用一个示例说明:

path.join('a', '/b');
// Returns: 'a/b'

path.resolve('a', '/b');
// Returns: '/b'

由此可以看出,join 人如其名,真的是在 join,而 resolve 就像之前说的,是一点点地 "cd" 过去。