10-通过路径访问资源
6.4 通过路径访问资源
Node的Path功能模块可以从文件系统的路径中转换和提取数据。同时它提供了一种跨平台的用于处理文件系统路径的方式,从而省去了为Linux和Windows分别编写模块的麻烦。
早些时候,当我们遍历目录下的所有文件并提取文件后缀名时,就提到过它的提取功能。
'use strict';
var fs = require('fs');
var path = require('path');
fs.readdir ('./',function(err, files) {
for (let file of files) {
console.log(file);
if (path.extname(file) == '.gz') {
fs.unlink('./' + file);
}
}
});
如果你想获取文件的基本名称(base name),可以用下面这段代码:
'use strict';
var fs = require('fs');
var path = require('path');
fs.readdir ('./',function(err, files) {
for (let file of files) {
let ext = path.extname(file);
let base = path.basename(file, ext);
console.log ('file ' + base + ' with extension of ' + ext);
}
});
path.basename()
函数的第二个参数表示会返回没有后缀的文件名。
Path模块还能屏蔽环境带来的影响,其中一个例子就是 path.delimeter
属性。这是系统特定的分隔符,在Linux中,它是冒号(:),在Windows中,它是分号(;)。如果你希望在应用程序中分解PATH的环境变量,且程序在这两种操作系统中都能工作,那么可以使用 path.delimeter
:
var path = require('path');
console.log(process.env.PATH);
console.log(process.env.PATH.split(path.delimiter));
上面的代码在两个环境中都能正常运行,并返回包含PATH变量的数组。
另一个不同之处是操作系统使用斜线(/)还是反斜线(\)。在第5章中,我创建了一个简单的Web服务器,它用一个文件系统的路径提供Web请求的响应资源。在Windows系统中,文件路径是用反斜线分隔的,而Linux系统则是用斜线分隔的。通过使用 path.normalize()
,我的应用程序就可以同时在这两个系统中工作了:
pathname = path.normalize(base + req.url);
Path模块最厉害的并不是那些我们用字符串对象或RegExp无法完成的强大的字符串转换功能,而是在不知道是何种操作系统(独立于操作系统)的情况下转换文件系统路径。
如果你需要解析文件路径,可以用 path.parse()
函数。这个函数返回的结果在不同的操作系统上有很大的差异。在Windows中,当我将 require.main.filename
或者其缩写形式 _ _filename
(执行程序的路径和名字)作为参数时,能看到如下输出:
{ root: 'C:\\',
dir: 'C:\\Users\\Shelley',
base: 'work',
ext: '.js',
name: 'path1' }
在我的Ubuntu服务器上,则得到如下输出:
{ root: '/',
dir: '/home/examples/public_html/learnnode2',
base: 'path1.js',
ext: '.js',
name: 'path1' }