处理文件一般都要涉及到对文件路径的处理,Node.js处理文件路径使用path模块。path模块可以帮你规范化连接和解析路径,还可以用于绝对路径到对路径的转换、提取路径的组成部分及判断路径是否存在等。
文件路径指文件的保存位置,可以分为相对路径和绝对路径。可以通过拼接文件路径检测文件是否存在,也可以访问文件信息。通过字符串来连接文件路径时会存在一些文件。如:有的部分需要带“/”,有的部分不需要,不同操作系统的路径分隔也不一样。因此,处理文件路径会比较困难,使用path模块可以很好的解决这些问题。path模块提供的功能有:
1.文件路径处理:path.normalize(p)
path模块中的normalize()方法用来规范化路径字符串。可用于处理路径中的"//"、".."、"."等字符。例如:
var path = require('path'); path.normalize('/foo/bar//baz/asdf/quux/..'); // 处理后 '/foo/bar/baz/asdf'
2.连接路径:path.join([path1][, path2][, ...])
path.join()方法可以连接任意多个路径字符串。要连接的多个路径可做为参数传入。path.join()方法在接边路径的同时也会对路径进行规范化。例如:
var path = require('path'); //合法的字符串连接 path.join('/foo', 'bar', 'baz/asdf', 'quux', '..') // 连接后 '/foo/bar/baz/asdf' //不合法的字符串将抛出异常 path.join('foo', {}, 'bar') // 抛出的异常 TypeError: Arguments to path.join must be strings'
3.路径解析:path.resolve([from ...], to)
path.resolve()方法可以将多个路径解析为一个规范化的绝对路径。其处理方式类似于对这些路径逐一进行cd操作,与cd操作不同的是,这引起路径可以是文件,并且可不必实际存在(resolve()方法不会利用底层的文件系统判断路径是否存在,而只是进行路径字符串操作)。例如:
path.resolve('foo/bar', '/tmp/file/', '..', 'a/../subfile')
其处理方式类型于
cd foo/bar cd /tmp/file/ cd .. cd a/../subfile pwd
如果解析的不是绝对路径,path.resolve()会将当前工作目录加到解析结果的前面。例如:
path.resolve('/foo/bar', './baz') // 输出结果为 '/foo/bar/baz' path.resolve('/foo/bar', '/tmp/file/') // 输出结果为 '/tmp/file' path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif') // 当前的工作路径是 /home/itbilu/node,则输出结果为 '/home/itbilu/node/wwwroot/static_files/gif/image.gif'
4.查找两个绝对路径的相对关系:path.relative(from, to)
path.relative()方法可以找出一个绝对路径到另一个绝对路径的相对关系。例如:
var path = require('path'); path.relative('/Users/liuht/code/itbilu/demo', '/Users/liuht/code/zszsgc/lib'); // 结果 '../../zszsgc/lib'
5.提取路径的组成部分:path.dirname(p)
、path.basename(p[, ext])
、path.extname(p)
path.dirname()方法可以提取出一个文件路径中的目录的部分。path.basename()方法可以提取出一个文件路径中的文件的部分。path.extname()方法可以提取文件的扩展名。例如:
var path = require('path'); path.dirname('/Users/liuht/code/itbilu/demo/path.js') // 结果 '/Users/liuht/code/itbilu/demo' path.basename('/Users/liuht/code/itbilu/demo/path.js') // 结果 'path.js' path.extname('/Users/liuht/code/itbilu/demo/path.js') // 结果 '.js'
path.basename()方法还可以指定第二个参数:文件的扩展名,指定后可以提取文件名。指定扩展名不合法时将返回文件全名。例如:
var path = require('path'); path.basename('/Users/liuht/code/itbilu/demo/path.js', '.js') // 结果 'path' path.basename('/Users/liuht/code/itbilu/demo/path.js', '.html') // 结果 'path.js'
在早期的Node.js版本中path模块还有个path.exists()方法,用于判断文件是否存在,但已被fs模块中的fs.exists()代替。