NodeJS-API之path模块

前言

    这个模块包含处理和转换文件路径的一套工具集,这些方法的大部分主要用于字符串变换。不会调用文件系统去检验路径是否合法。
    你只需要require('path')即可使用这个模块,下面的这些方法是所被提供的:

1.path.basename(p[, ext])

    返回一个路径中的最后一部分. 与Unix 的 basename 命令很相似。
第二个参数是可选项,只能传后缀名,如果未传则是情况一,会得到带后缀名的文件名;如果传了则是情况二,则会得到不带后缀名的文件名,
例:

1
2
3
4
5
path.basename('/foo/bar/baz/asdf/quux.html')
// returns 'quux.html'

path.basename('/foo/bar/baz/asdf/quux.html', '.html')
// returns 'quux'

2.path.delimiter

    特定平台的路径分隔符, ;或者':'.
*nix上的例子:

1
2
3
4
5
console.log(process.env.PATH)
// '/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']

Windows上的例子:

1
2
3
4
5
console.log(process.env.PATH)
// '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\\']

3.path.dirname(p)

    返回一个路径的文件夹名,相当于Unix中的dirname命令。
例:

1
2
path.dirname('/foo/bar/baz/asdf/quux')
// returns '/foo/bar/baz/asdf'

4.path.extname(p)

    返回路径中文件的扩展名,在从路径最后一部分中的最后一个’.’到字符串的末尾。如果在路径的最后一部分没有’.’,或者第一个字符是’.’,就返回一个 空字符串。
例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
path.extname('index.html')
// returns '.html'

path.extname('index.coffee.md')
// returns '.md'

path.extname('index.')
// returns '.'

path.extname('index')
// returns ''

path.extname('.index')
// returns ''

5.path.format(pathObject)

    从一个路径对象中返回一个路径字符串,它刚好跟path.prase相反。
    如果pathObjectdirbase属性,那么返回的字符串将会是dir属性、所在平台的路径分隔符以及base属性三者链接起来。
    如果没有提供dir属性,root属性将会被当做dir属性来用。然而,假设当root属性以所依赖的平台分隔符所结束时,在这种情况下,返回的字符串将会是root属性和base属性的链接起来的字符串。
    如果dir和root属性都没有被提供的话,那么返回的字符串将会是base属性的内容。
    如果base属性没有被提供,那么base属性将会是name属性和ext(后缀名)属性的结合。
下面看几个官方实例就会很清楚了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 当提供dir和base的时候,将会返回 `dir + platform separator + base`
path.format({
dir: '/home/user/dir',
base: 'file.txt'
});
// returns '/home/user/dir/file.txt'

// 当dir没有指定的时候root将会被使用,当base没有指定的时候name和ext将会被使用;如果仅仅是root被提供,或者是dir跟root相等,那么这时候就不会包含平台的分隔符了
path.format({
root: '/',
base: 'file.txt'
});
// returns '/file.txt'

path.format({
dir: '/',
root: '/',
name: 'file',
ext: '.txt'
});
// returns '/file.txt'

// 如果dir或者root没有提供的时候会直接将base对应的字符串返回
path.format({
base: 'file.txt'
});
// returns 'file.txt'

Windows当中的例子:

path.format({
root : "C:\\",
dir : "C:\\path\\dir",
base : "file.txt",
ext : ".txt",
name : "file"
})
// returns 'C:\\path\\dir\\file.txt'

6.path.isAbsolute(path)

    判断path是否是一个绝对路径,绝对路径经常会被用来处理同一个地址,不管是在哪一个目录下。
例:

1
2
3
4
5
6
7
8
9
10
11
path.isAbsolute('/foo/bar') // true
path.isAbsolute('/baz/..') // true
path.isAbsolute('qux/') // false
path.isAbsolute('.') // false

Windows 中的例子:

path.isAbsolute('//server') // true
path.isAbsolute('C:/foo/..') // true
path.isAbsolute('bar\\baz') // false
path.isAbsolute('.') // false

注意:如果这个路径字符串传一个长度为0的字符串,那么不像其他路径模块函数,它将会被照样输出,并返回一个false。

7.path.join([path1][, path2][, …])

    连接所有的参数到一起并且格式化这个生成的路径,所以以后只要涉及到拼接路径字符串,就采用它,这样就不易出错了,你多写了/它也会自动帮你处理掉,大大提高容错率。
这些参数必须是字符串的格式,在v0.8,不是字符串格式的参数会被默默地忽略掉。在v0.10以及以上,会抛出一个异常。
例:

1
2
3
4
5
6
path.join('/foo', 'bar', 'baz/asdf', 'quux', '..')
// returns '/foo/bar/baz/asdf'

path.join('foo', {}, 'bar')
// throws exception
TypeError: Arguments to path.join must be strings

注意:如果这个参数添加一个长度为0的字符串,不像其他路径模块函数,它将会被忽略。如果连接的路径字符串是一个长度为0的字符串,接下来会返回一个代表自己当前的工作目录的路径。
这个API的一个重要的应用场景,是将相对路径转为绝对路径,通过path.join(__dirname,’相对路径’) => 就会将这个相对路径转为绝对路径,在某些场景下极为有用。

8.path.normalize(p)

    规范规范化字符串路径,注意 ‘..’ 和 `’.’ 部分。
    多个斜杠会被替换成一个;路径末尾的斜杠会被保留; Windows 系统上, 会使用反斜杠。
例:

1
2
path.normalize('/foo/bar//baz/asdf/quux/..')
// returns '/foo/bar/baz/asdf'

注意:如果路径字符串中传入了一个长度为0的字符串,那么将会返回当前工作文件目录名。

9. path.parse(pathString)

    从传入的一个路径字符串中返回一个对象。
例如在*nix上:

1
2
3
4
5
6
7
8
9
path.parse('/home/user/dir/file.txt')
// returns
// {
// root : "/",
// dir : "/home/user/dir",
// base : "file.txt",
// ext : ".txt",
// name : "file"
// }

在Windows上:

1
2
3
4
5
6
7
8
9
path.parse('C:\\path\\dir\\index.html')
// returns
// {
// root : "C:\\",
// dir : "C:\\path\\dir",
// base : "index.html",
// ext : ".html",
// name : "index"
// }

类Unix系统不像Windows系统那样具有好几个盘符

10. path.posix

    提供上述的路径方法,并且总是以posix兼容的方式进行交互。

POSIX 表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。

11. path.relative(from, to)

    解决从from到to的相对路径。
    有时候我们有两个绝对路径,我们需要从中找出相对目录的起源目录。这其实就是path.resolve的相反实现,我们可以看看是什么意思:

1
path.resolve(from, path.relative(from, to)) == path.resolve(to)

例:

1
2
3
4
5
path.relative('C:\\orandea\\test\\aaa', 'C:\\orandea\\impl\\bbb')
// returns '..\\..\\impl\\bbb'

path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb')
// returns '../../impl/bbb'

注意:如果相对路径中有长度为0的字符串,那么当前的工作目录将会被用来代替那个长度为0的字符串。如果两个路径
一样,那么将会返回一个长度为0的字符串,其实就是一个空字符串;

12. path.resolve([from …], to)

    将to解析为一个绝对路径。
    如果to不是一个相对于from 参数的绝对路径,to会被添加到from的右边,直到找出一个绝对路径为止。如果使用from路径且仍没有找到绝对路径时,使用当时路径作为目录。返回的结果已经规范化,得到的路径会去掉结尾的斜杠,除非得到的当前路径为root目录。非字符串参数将被忽略。
    其实还有一种便于记忆的方法就是把它看做一系列 cd 命令.

1
path.resolve('foo/bar', '/tmp/file/', '..', 'a/../subfile')

相似与:

1
2
3
4
5
cd foo/bar
cd /tmp/file/
cd ..
cd a/../subfile
pwd

不同的是,有时候不同的路径也是不需要存在的,也可能是文件。
例:

1
2
3
4
5
6
7
8
9
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')
// 如果当前在 /home/myself/node, it returns
// '/home/myself/node/wwwroot/static_files/gif/image.gif'

注意:如果参数中需要解析长度为0的字符串,那么将会返回当前的工作目录来代替它们。

13. path.sep

特定操作系统的分隔符。如 ‘\‘ or ‘/‘.

1
2
3
4
5
6
7
8
9
例如在 *nix上:

'foo/bar/baz'.split(path.sep)
// returns ['foo', 'bar', 'baz']

在Windows上:

'foo\\bar\\baz'.split(path.sep)
// returns ['foo', 'bar', 'baz']

14. path.win32

    提供上述的路径方法,但目前是只兼容win32的方式进行交互。