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

image 2024 04 16 16 05 14 181
Figure 1. 图11.15 相对路径的使用(1)
  • 目标文件位于当前路径的下一级。如果目标文件位于当前路径的下一级时,其访问格式为:目标文件的父文件夹名称+“\\”+目标文件名称。以图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。

image 2024 04 16 16 06 40 617
Figure 2. 图11.16 相对路径的使用(2)
image 2024 04 16 16 07 02 719
Figure 3. 图11.17 相对路径的使用(3)

【例11.5】通过指定相对路径读取文件。(实例位置:资源包\源码\11\05)

使用 Node.js 读取一个记事本文件,并且将文件中的内容显示在控制台中,步骤如下。

  1. 新建一个文件夹,名为 text,并在该文件夹中放置一个记事本文件,名为 story.txt

  2. 新建一个 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所示。

image 2024 04 16 16 08 29 074
Figure 4. 图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所示。

image 2024 04 16 16 37 17 362
Figure 5. 图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 为字符串,表示路径。返回值有 truefalse,当路径为绝对路径时,返回值为 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 所示。

image 2024 04 16 17 08 15 158
Figure 6. 图11.20 使用 resove() 方法将路径解析为绝对路径

将路径转换为相对路径

path 模块提供了 relative() 方法可以将路径转换为相对路径,其语法格式如下:

path.relative(from,to)

参数 fromto 都是字符串,用来传入两个路径。该方法可以根据当前工作目录返回 fromto 的相对路径。如果 fromto 各自解析到相同的路径,则返回空字符串。

示例代码如下:

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));

上面代码中,定义了两个路径 pa1pa2,然后分别返回 pa1pa2 的相对路径、pa1pa1 的相对路径,运行结果如下:

js.js

通过上面的结果可以看到,当 fromto 路径相同时,其返回值为空。

【例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所示。

image 2024 04 16 17 12 07 679
Figure 7. 图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

解析和规范化路径时,normalize() 方法不会判断该路径是否真实存在,只是根据获得的信息来分析路径。

path模块的属性

path 模块除提供方法执行一些常见的文件及路径操作外,还提供了一些属性,这里了解即可,具体如下。

  • path.delimiter:提供平台特定的路径定界符,其值有 “;” 和 “:”。如果在 POSIX(portable operating system interface,可移植操作系统接口)平台上,其为 “:”;如果在 Windows 平台上,其为 “;”。

  • path.sep:提供平台特定的路径片段分隔符,其值有 “\” 和 “/”。如果在 POSIX 平台上,其值为 “/”;如果在 Windows 平台上,其值为 “\”。

  • path.posix:提供特定于 POSIX 平台的 path 方法的访问。

  • path.win32:提供特定于 Windows 平台的 path 方法的访问。