path模块
path
模块提供了用于处理文件路径的方法,本节将首先了解计算机中的绝对路径和相对路径,然后讲解使用 path
模块中对路径的常见操作。
绝对路径和相对路径
大家都知道,我们平时使用计算机查找文件时,必须知道文件的位置,而表示文件的位置就需要使用路径。比如当看到路径 D:/images/a.png
时,就知道 a.png
文件位于 D
盘的 images
文件夹中。计算机中通常有两种方式表示路径,即绝对路径和相对路径,下面分别介绍。
绝对路径
绝对路径指的是文件在计算机本地的实际路径,例如上文中的 D:/images/a.png
。使用绝对路径时需要确保文件路径与实际位置一致。例如开发项目时,使用绝对路径引用了图片,项目完成后,如果将该项目部署到服务器上,要想访问使用了绝对路径的图片,则服务器上也必须存在与之相符的路径,否则图片将无法显示。比如项目中使用了 D:/images/a.png
,则在部署项目的服务器上也必须存在 D
盘,并且 D
盘中需要存在 images
文件夹,该文件夹中存在 a.png
图片文件。从这里可以看出,使用绝对路径有很大的局限性,在开发实际项目时,不推荐使用。
相对路径
相对路径是指当前文件所在路径与其他文件(或文件夹)的路径关系,相对路径的使用方法有以下 3 种。
-
目标文件与当前路径同级。如果目标文件与当前路径为同级时,其访问格式为 “.\”+目标文件名称,其中 “.\” 可以省略,以图 11.15 为例,如果要在
js.js
文件中使用story.txt
文件,那么可以直接使用路径.\story.txt
或者story.txt
。

-
目标文件位于当前路径的下一级。如果目标文件位于当前路径的下一级时,其访问格式为:目标文件的父文件夹名称+“\\”+目标文件名称。以图11.16为例,如果要在 js.js 文件中使用 story.txt 文件,由于 js.js 与 story.txt 的父文件夹 dire 位于同一级,因此需要使用 dire\\story.txt。
-
目标文件位于当前路径的上一级。如果目标文件位于当前路径的上一级,其访问格式为“..\\”+目标文件名称,以此类推,如果目标文件位于当前路径的上上级,则其访问格式为 “..\\..\\” +目标文件名称。以图11.17为例,如果要在 js.js 中使用 story.txt 文件,由于 story.txt 文件与 js.js 文件的父文件夹 dire 同级,因此应该使用 ..\\story.txt。


【例11.5】通过指定相对路径读取文件。(实例位置:资源包\源码\11\05)
使用 Node.js 读取一个记事本文件,并且将文件中的内容显示在控制台中,步骤如下。
-
新建一个文件夹,名为
text
,并在该文件夹中放置一个记事本文件,名为story.txt
。 -
新建一个
js.js
文件,该文件与text
文件夹同级,在js.js
文件中实现读取story
文本文件内容并显示的功能,代码如下:
var fs=require("fs"); //引入fs模块
var path="text\\story.txt" //定义story.txt文件的路径
text=fs.readFileSync(path,"utf8") //读取文件
console.log(text) //显示文件内容
运行程序,效果如图11.18所示。

path模块的常见操作
使用 path
模块之前需要引入该模块,代码如下:
var path=require("path");
下面对使用 path
模块的常用操作进行讲解。
获取文件所在目录
获取文件所在的目录,需要使用 dirname()
方法,其语法格式如下:
path.dirname(p)
参数 p
为字符串,表示路径(包含文件名)。示例代码如下:
var path=require("path")
pa=path.dirname("D:\\Demo\\11\\js.js")
console.log(pa)
运行结果如下:
D:\Demo\11
获取文件名
获取指定路径中的文件名,需要使用 basename()
方法,其语法格式如下:
path.basename(p[,ext])
参数 p
为字符串,表示路径;ext
为可选参数,表示文件的扩展名。示例代码如下:
var path=require("path")
pa=path.basename("D:\\Demo\\11\\js.js")
console.log(pa)
运行结果如下:
js.js
如果将上面代码中的第 2 行修改如下:
pa=path.basename("D:\\Demo\\11\\js.js",".js")
则运行结果如下:
js
获取扩展名
获取文件扩展名需要使用 extname()
方法,其语法格式如下:
path.extname(p)
参数 p
为字符串,用于指定一个路径。示例代码如下:
var path=require("path")
pa=path.extname("D:\\Demo\\11\\js.js")
console.log(pa)
运行结果如下:
.js
【例11.6】通过扩展名获取文件夹中的图片文件。(实例位置:资源包\源码\11\06)
新建一个 js.js
文件,在该文件中通过 fs
模块的 readdir()
方法获取 media
文件夹中的所有文件,然后使用 path
模块的 extname()
方法依次获取文件的扩展名,并且判断其扩展名是否为 .png
或 .jpg
,如果是,则输出文件名。代码如下:
var path = require("path")
var fs = require('fs');
var text = "media文件夹中的图片有"
fs.readdir('media', function (err, files) { //获取media文件夹中的所有文件
if (err) console.log('读取目录操作失败。'); //读取错误时的返回内容
else {
for (var i = 0; i < files.length; i++) { //通过for循环遍历每文件夹中的文件
//判断文件的扩展名
if (path.extname(files[i]) == ".jpg"> || path.extname(files[i]) == ".png") {
text += path.basename(files[i]) + "、"
}
}
console.log(text)
}
});
运行程序,效果如图11.19所示。

解析路径的组成
path
模块提供了 parse()
方法,可以将指定路径解析为一个路径对象,其语法格式如下:
path.parse(p)
参数 p
表示路径;该方法的返回值为一个路径对象,该对象有以下属性。
-
root
:路径所属的根盘符。 -
dir
:路径所属的文件夹。 -
base
:路径对应的文件名。 -
ext
:路径对应文件的扩展名。 -
name
:文件对应的文件名称(不包含扩展名)。
示例代码如下:
var path=require("path")
pa="D:\\Demo\\07\\03\\js.js"
console.log(path.parse(pa))
运行结果如下:
{
root: 'D:\\',
dir: 'D:\\Demo',
base: 'js.js',
ext: '.js',
name: 'js'
}
从对象返回路径字符串
path
模块中提供了一个 format()
方法,该方法与 parse()
方法的功能正好相反,它可以将路径对象转换为路径字符串。其语法格式如下:
path.format(pathObject)
参数 pathObject
为路径对象,为其添加属性时,需要遵循以下优先级。
-
dir
属性高于root
属性,所以同时出现dir
属性和root
属性时,忽略root
属性。 -
base
属性高于name
属性和ext
属性,所以当base
属性出现时,忽略name
属性和ext
属性。
例如,分别定义 3 个路径对象,其中设置不同的属性值,最后使用 path
模块的 format()
方法将这 3 个路径对象转换为字符串输出,代码如下:
var path = require("path")
pathObj1 = {
root: 'D:\\',
dir: "D:\\demo\\images",
base: 'a.png',
name: 'a',
ext: '.png'
}
pathObj2 = {
dir: "D:\\demo\\images",
base: 'a.png',
}
pathObj3 = {
dir: "D:\\demo\\images",
name: 'a',
ext: '.png'
}
console.log(path.format(pathObj1))
console.log(path.format(pathObj2))
console.log(path.format(pathObj3))
上面代码中创建了 3 个路径对象,第 1 个对象 pathObj1
设置了路径对象的所有属性;第 2 个路径对象 pathObj2
省略了 root
属性、name
属性和 ext
属性;第 3 个路径对象 pathObj3
省略了 root
属性和 base
属性。运行结果如下:
D:\demo\images\a.png
D:\demo\images\a.png
D:\demo\images\a.png
判断路径是否为绝对路径
path
模块提供了 isAbsolute()
方法,用于判断路径是否为绝对路径,其语法格式如下:
path.isAbsolute(p)
参数 p
为字符串,表示路径。返回值有 true
和 false
,当路径为绝对路径时,返回值为 true
,反之为 false
。
例如,新建 js.js
文件,在该文件中添加两个路径,然后判断其是否为绝对路径,代码如下:
var path=require("path")
pa1="D:\\Demo\\js.js"
pa2="..\\Demo\\js.js"
console.log(path.isAbsolute(pa1))
console.log(path.isAbsolute(pa2))
运行结果如下:
true
false
将路径解析为绝对路径
使用 path.resolve()
方法可以将路径解析为绝对路径,其语法格式如下:
path.resolve([...paths])
参数 paths
为路径或者路径序列,即可以有一个也可以是多个。使用该方法时,需要注意以下 3 点。
-
给定的路径序列会从右到左进行处理,后面的每个
path
会被追加到前面,直到构造出绝对路径。例如下面代码:
path.resolve("E:","目录1","目录2","目录3")
运行结果如下:
E:\目录1\目录2\目录3
-
如果
resolve()
方法中的路径序列经处理后无法构造成绝对路径,则处理后的路径序列会自动追加到当前工作目录。例如下面代码:
path.resolve("目录1","目录2","目录3")
运行结果如下:
D:\Demo\11\07\目录1\目录2\目录3
上面的返回结果中的 “D:\Demo\11\07\” 为当前工作目录,因为处理后的路径 “目录1\目录2\目录3” 不是绝对路径,所以自动将其追加到当前工作目录。
-
如果参数值为空,则返回当前工作路径。示例代码如下:
path.resolve()
返回结果如下:
D:\Demo\11\07
上面的返回结果为笔者的当前工作路径,读者学习时,返回值应该为读者的实际工作路径。 |
【例11.7】使用 resolve() 方法处理路径片段。(实例位置:资源包\源码\11\07)
创建 js.js
文件,在该文件中定义 4 个路径字符串,然后通过 resolve()
方法,将其解析为不同的绝对路径。代码如下:
var path=require("path")
var pa1="E:"
var pa2="media"
var pa3="a.mp4"
var pa4="..\\07"
console.log(path.resolve(pa2,pa3))
console.log(path.resolve(pa1,pa2,pa3))
console.log(path.resolve(pa4,pa2,pa3))
运行程序,效果如图 11.20 所示。

将路径转换为相对路径
path
模块提供了 relative()
方法可以将路径转换为相对路径,其语法格式如下:
path.relative(from,to)
参数 from
和 to
都是字符串,用来传入两个路径。该方法可以根据当前工作目录返回 from
到 to
的相对路径。如果 from
和 to
各自解析到相同的路径,则返回空字符串。
示例代码如下:
var path=require("path");
pa1="D:\\Demo\\11";
pa2="D:\\Demo\\11\\js.js";
console.log(path.relative(pa1,pa2));
console.log(path.relative(pa1,pa1));
上面代码中,定义了两个路径 pa1
和 pa2
,然后分别返回 pa1
到 pa2
的相对路径、pa1
到 pa1
的相对路径,运行结果如下:
js.js
通过上面的结果可以看到,当 from
和 to
路径相同时,其返回值为空。
【例11.8】将列表中的绝对路径转换为相对路径。(实例位置:资源包\源码\11\08)
新建一个 js
文件,在文件中添加一个由路径字符串组成的列表,然后在 for
循环中使用 isAbsolute()
方法依次判断路径是否为绝对路径,如果是绝对路径,则将其转换为相对路径,代码如下:
var path = require("path");
pathList = ["D:\\mydiro\\index.html",
"..\\images\\a.png",
"D:\\mydiro\\images\\b.jpg">,
"D:\\mydiro\\js\\bootstrap.min.js",
"..\\js\\main.js",
"D:\\mydiro\\css\\bootstrap.min.css",
"..\\css\\main.css"
]
var text1="所有路径如下:"
var text2=""
for (var i = 0; i < pathList.length; i++) {
text1 += pathList[i] + "\t";
if (path.isAbsolute(pathList[i])) {
text2 += pathList[i] + " 为绝对路径,将其转换为相对路径为:" + path.relative(pathList[0], pathList[i]) + "\n"
}
}
console.log(text1 + "\n")
console.log(text2)
运行程序,效果如图11.21所示。

多路径的拼接
path
模块中的 join()
方法连接路径(使用平台特定的路径分隔符,POSIX 系统是/,Windows 系统是\),其语法格式如下:
path.join([…paths])
上述语法中,参数 paths
为多个路径片段。示例代码如下:
var path=require("path")
var pa1="\\images"
var pa2="a.png"
var pa3="..\\video.mp4"
console.log(path.join(pa1,pa2))
console.log(path.join(pa1,pa2,pa3))
运行结果如下:
\images\a.png
\images\video.mp4
规范化路径
path
模块中的 normalize()
方法可用于解析和规范化路径,当路径中包含 “.”、“..”、“\”、“/” 之类的相对说明符时,该方法会尝试分析实际的路径。normalize()
方法的语法格式如下:
path.normalize(p)
参数 p
用于指定路径字符串。
例如,使用 normalize()
方法对含有“.”、“..”、“\”、“/” 等相对说明符的路径进行解析,代码如下:
var path = require("path")
pa1 = "D:/demo/11/js.js"
pa2 = "D:/\\demo\\/11/\\js.js"
pa3 = "D:\\demo\\11\\js.js"
pa4 = "..\\demo\\a.mp4"
pa5 = ".\\demo\\a.mp4"
pa6 = "../demo/a.mp4"
pa7 = "./demo/a.mp4"
console.log(path.normalize(pa1))
console.log(path.normalize(pa2))
console.log(path.normalize(pa3))
console.log(path.normalize(pa4))
console.log(path.normalize(pa5))
console.log(path.normalize(pa6))
console.log(path.normalize(pa7))
运行结果如下:
D:\Demo\11\10>node js.js
D:\demo\11\js.js
D:\demo\11\js.js
D:\demo\11\js.js
..\demo\a.mp4
demo\a.mp4
..\demo\a.mp4
demo\a.mp4
解析和规范化路径时, |
path模块的属性
path
模块除提供方法执行一些常见的文件及路径操作外,还提供了一些属性,这里了解即可,具体如下。
-
path.delimiter
:提供平台特定的路径定界符,其值有 “;” 和 “:”。如果在 POSIX(portable operating system interface,可移植操作系统接口)平台上,其为 “:”;如果在 Windows 平台上,其为 “;”。 -
path.sep
:提供平台特定的路径片段分隔符,其值有 “\” 和 “/”。如果在 POSIX 平台上,其值为 “/”;如果在 Windows 平台上,其值为 “\”。 -
path.posix
:提供特定于 POSIX 平台的 path 方法的访问。 -
path.win32
:提供特定于 Windows 平台的 path 方法的访问。