이 글은 Node.js의 경로 처리 모듈 경로를 주로 소개합니다. 이제 여러분과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.
nodejs에서는 경로가 사용법이라는 것은 모두가 알고 있을 것입니다. 매우 자주 사용되는 모듈이지만 사람들이 좋아하거나 싫어하는 모듈입니다. 일부 문서는 명확하지 않고 일부는 인터페이스의 플랫폼 차이로 인해 발생하기 때문입니다. 이번 글에서는 Node.js의 경로 처리 모듈 경로에 대해 자세히 소개하겠습니다. 모듈 경로를 학습하거나 사용하는 데 도움이 되기를 바랍니다.
머리말
이 모듈에서는 경로를 처리하고 변환하는 데 사용할 수 있는 많은 메서드와 속성이 제공됩니다. 경로 인터페이스를 경로에 따라 분류하면 됩니다. 신중하게 사용하고 생각하면 그렇게 혼란스럽지 않을 것입니다. 아래에서는 Node.js의 경로 처리 모듈 경로를 자세히 소개하겠습니다.
경로/파일 이름/확장명 가져오기
경로 가져오기: path.dirname(filepath)<code>path.dirname(filepath)<br>
获取文件名:path.basename(filepath)<br>
获取扩展名:path.extname(filepath)<br>
获取所在路径
例子如下:
var path = require('path'); var filepath = '/tmp/demo/js/test.js'; // 输出:/tmp/demo/js console.log( path.dirname(filepath) );
获取文件名
严格意义上来说,path.basename(filepath)
只是输出路径的最后一部分,并不会判断是否文件名。
但大部分时候,我们可以用它来作为简易的“获取文件名“的方法。
var path = require('path'); // 输出:test.js console.log( path.basename('/tmp/demo/js/test.js') ); // 输出:test console.log( path.basename('/tmp/demo/js/test/') ); // 输出:test console.log( path.basename('/tmp/demo/js/test') );
如果只想获取文件名,单不包括文件扩展呢?可以用上第二个参数。
// 输出:test console.log( path.basename('/tmp/demo/js/test.js', '.js') );
获取文件扩展名
简单的例子如下:
var path = require('path'); var filepath = '/tmp/demo/js/test.js'; // 输出:.js console.log( path.extname(filepath) );
更详细的规则是如下:(假设 path.basename(filepath) === B
)
从B的最后一个.开始截取,直到最后一个字符。
如果B中不存在.,或者B的第一个字符就是.,那么返回空字符串。
直接看官方文档的例子
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 ''
路径组合
path.join([...paths]) path.resolve([...paths])
path.join([...paths])
把paths拼起来,然后再normalize一下。这句话反正我自己看着也是莫名其妙,可以参考下面的伪代码定义。
例子如下:
var path = require('path'); // 输出 '/foo/bar/baz/asdf' path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
path定义的伪代码如下:
module.exports.join = function(){ var paths = Array.prototye.slice.call(arguments, 0); return this.normalize( paths.join('/') ); };
path.resolve([...paths])
这个接口的说明有点啰嗦。你可以想象现在你在shell下面,从左到右运行一遍cd path命令,最终获取的绝对路径/文件名,就是这个接口所返回的结果了。
比如 path.resolve('/foo/bar', './baz')
可以看成下面命令的结果
cd /foo/bar cd ./baz
更多对比例子如下:
var path = require('path'); // 假设当前工作路径是 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path // 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path console.log( path.resolve('') ) // 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path console.log( path.resolve('.') ) // 输出 /foo/bar/baz console.log( path.resolve('/foo/bar', './baz') ); // 输出 /foo/bar/baz console.log( path.resolve('/foo/bar', './baz/') ); // 输出 /tmp/file console.log( path.resolve('/foo/bar', '/tmp/file/') ); // 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path/www/js/mod.js console.log( path.resolve('www', 'js/upload', '../mod.js') );
路径解析
path.parse(path)
path.normalize(filepath)
从官方文档的描述来看,path.normalize(filepath)
应该是比较简单的一个API,不过用起来总是觉得没底。
为什么呢?API说明过于简略了,包括如下:
如果路径为空,返回.,相当于当前的工作路径。
将对路径中重复的路径分隔符(比如linux下的/)合并为一个。
对路径中的.、..进行处理。(类似于shell里的cd ..)
如果路径最后有/,那么保留该/。
感觉stackoverflow上一个兄弟对这个API的解释更实在,原文链接。
In other words, path.normalize is "What is the shortest path I can take that will take me to the same place as the input"
代码示例如下。建议读者把代码拷贝出来运行下,看下实际效果。
var path = require('path'); var filepath = '/tmp/demo/js/test.js'; var index = 0; var compare = function(desc, callback){ console.log('[用例%d]:%s', ++index, desc); callback(); console.log('\n'); }; compare('路径为空', function(){ // 输出 . console.log( path.normalize('') ); }); compare('路径结尾是否带/', function(){ // 输出 /tmp/demo/js/upload console.log( path.normalize('/tmp/demo/js/upload') ); // /tmp/demo/js/upload/ console.log( path.normalize('/tmp/demo/js/upload/') ); }); compare('重复的/', function(){ // 输出 /tmp/demo/js console.log( path.normalize('/tmp/demo//js') ); }); compare('路径带..', function(){ // 输出 /tmp/demo/js console.log( path.normalize('/tmp/demo/js/upload/..') ); }); compare('相对路径', function(){ // 输出 demo/js/upload/ console.log( path.normalize('./demo/js/upload/') ); // 输出 demo/js/upload/ console.log( path.normalize('demo/js/upload/') ); }); compare('不常用边界', function(){ // 输出 .. console.log( path.normalize('./..') ); // 输出 .. console.log( path.normalize('..') ); // 输出 ../ console.log( path.normalize('../') ); // 输出 / console.log( path.normalize('/../') ); // 输出 / console.log( path.normalize('/..') ); });
文件路径分解/组合
path.format(pathObject)
:将pathObject的root、dir、base、name、ext属性,按照一定的规则,组合成一个文件路径。
path.parse(filepath)
:path.format()
path.basename(filepath)<p> < /code></p><p> 확장자 가져오기: <code>path.extname(filepath)</p>
🎜🎜경로 가져오기🎜🎜🎜🎜🎜예제는 다음과 같습니다.🎜🎜🎜┌─────────────────────┬────────────┐ │ dir │ base │ ├──────┬ ├──────┬─────┤ │ root │ │ name │ ext │ " / home/user/dir / file .txt " └──────┴──────────────┴──────┴─────┘ (all spaces in the "" line should be ignored -- they are purely for formatting)
path.basename(filepath)
는 경로의 마지막 부분만 출력하고 파일 이름인지 여부는 확인하지 않습니다. 🎜🎜하지만 대부분의 경우 "파일 이름 가져오기"라는 간단한 방법으로 사용할 수 있습니다. 🎜🎜🎜┌─────────────────────┬────────────┐ │ dir │ base │ ├──────┬ ├──────┬─────┤ │ root │ │ name │ ext │ " C:\ path\dir \ file .txt " └──────┴──────────────┴──────┴─────┘ (all spaces in the "" line should be ignored -- they are purely for formatting)
var path = require('path'); var p1 = path.format({ root: '/tmp/', base: 'hello.js' }); console.log( p1 ); // 输出 /tmp/hello.js var p2 = path.format({ dir: '/tmp', name: 'hello', ext: '.js' }); console.log( p2 ); // 输出 /tmp/hello.js
path.parse('/home/user/dir/file.txt') // returns // { // root : "/", // dir : "/home/user/dir", // base : "file.txt", // ext : ".txt", // name : "file" // }
var path = require('path'); var p1 = path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb'); console.log(p1); // 输出 "../../impl/bbb" var p2 = path.relative('/data/demo', '/data/demo'); console.log(p2); // 输出 "" var p3 = path.relative('/data/demo', ''); console.log(p3); // 输出 "../../Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path"
> path.win32.join('/tmp', 'fuck') '\tmp\fuck' > path.win32.sep '\' > path.win32.join('\tmp', 'demo') '\tmp\demo' > path.win32.join('/tmp', 'demo') '\tmp\demo'
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']
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\']
path.resolve('/foo/bar', './baz')
는 다음 명령의 결과로 볼 수 있습니다🎜🎜🎜rrreee🎜🎜🎜더 많은 비교 예는 다음과 같습니다. 다음과 같습니다:🎜🎜🎜 rrreee🎜🎜🎜🎜🎜경로 구문 분석🎜🎜🎜🎜🎜path.parse(경로)
🎜🎜🎜path.normalize( filepath)🎜🎜🎜🎜 🎜공식 문서의 설명으로 보면 path.normalize(filepath)
는 비교적 간단한 API여야 하는데, 사용할 때 늘 헷갈리는 부분이 있습니다. 🎜🎜왜? API 설명이 너무 짧고 다음 내용이 포함되어 있습니다. 🎜🎜 경로가 비어 있으면 현재 작업 경로와 동일한 .을 반환합니다. 🎜🎜🎜 경로에서 반복되는 경로 구분 기호(예: Linux의 /)를 하나로 병합합니다. 🎜🎜🎜 경로에서 ., ..를 처리합니다. (셸의 cd와 유사합니다..) 🎜🎜🎜 경로 끝에 /가 있으면 /를 유지합니다. 🎜🎜🎜Stackoverflow의 한 형제가 이 API에 대해 더 현실적인 설명을 하고 있는 것 같습니다. 원본 링크는 다음과 같습니다. 🎜🎜🎜rrreee🎜🎜🎜코드 예시는 다음과 같습니다. 독자가 코드를 복사하고 실행하여 실제 효과를 확인하는 것이 좋습니다. 🎜🎜🎜rrreee🎜🎜🎜🎜🎜파일 경로 분해/조합🎜🎜🎜🎜🎜path.format(pathObject)
:에 따라 pathObject의 루트, dir, 기본, 이름 및 확장 속성을 변경합니다. 특정 규칙을 파일 경로로 결합합니다. 🎜🎜🎜path.parse(filepath)
: path.format()
메서드의 반대 작업입니다. 🎜🎜🎜먼저 공식 홈페이지의 관련 속성 설명을 살펴보겠습니다. 🎜🎜우선, Linux에서는🎜🎜🎜┌─────────────────────┬────────────┐ │ dir │ base │ ├──────┬ ├──────┬─────┤ │ root │ │ name │ ext │ " / home/user/dir / file .txt " └──────┴──────────────┴──────┴─────┘ (all spaces in the "" line should be ignored -- they are purely for formatting)
然后是windows下
┌─────────────────────┬────────────┐ │ dir │ base │ ├──────┬ ├──────┬─────┤ │ root │ │ name │ ext │ " C:\ path\dir \ file .txt " └──────┴──────────────┴──────┴─────┘ (all spaces in the "" line should be ignored -- they are purely for formatting)
path.format(pathObject)
阅读相关API文档说明后发现,path.format(pathObject)
中,pathObject的配置属性是可以进一步精简的。
根据接口的描述来看,以下两者是等价的。
root vs dir:两者可以互相替换,区别在于,路径拼接时,root后不会自动加/,而dir会。
base vs name+ext:两者可以互相替换。
var path = require('path'); var p1 = path.format({ root: '/tmp/', base: 'hello.js' }); console.log( p1 ); // 输出 /tmp/hello.js var p2 = path.format({ dir: '/tmp', name: 'hello', ext: '.js' }); console.log( p2 ); // 输出 /tmp/hello.js
path.parse(filepath)
path.format(pathObject)
的反向操作,直接上官网例子。
四个属性,对于使用者是挺便利的,不过path.format(pathObject)
中也是四个配置属性,就有点容易搞混。
path.parse('/home/user/dir/file.txt') // returns // { // root : "/", // dir : "/home/user/dir", // base : "file.txt", // ext : ".txt", // name : "file" // }
获取相对路径
接口:path.relative(from, to)
描述:从from路径,到to路径的相对路径。
边界:
如果from、to指向同个路径,那么,返回空字符串。
如果from、to中任一者为空,那么,返回当前工作路径。
上例子:
var path = require('path'); var p1 = path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb'); console.log(p1); // 输出 "../../impl/bbb" var p2 = path.relative('/data/demo', '/data/demo'); console.log(p2); // 输出 "" var p3 = path.relative('/data/demo', ''); console.log(p3); // 输出 "../../Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path"
平台相关接口/属性
以下属性、接口,都跟平台的具体实现相关。也就是说,同样的属性、接口,在不同平台上的表现不同。
path.posix
:path相关属性、接口的linux实现。
path.win32
:path相关属性、接口的win32实现。
path.sep
:路径分隔符。在linux上是/,在windows上是``。
path.delimiter
:path设置的分割符。linux上是:,windows上是;。
注意,当使用 path.win32 相关接口时,参数同样可以使用/做分隔符,但接口返回值的分割符只会是``。
直接来例子更直观。
> path.win32.join('/tmp', 'fuck') '\\tmp\\fuck' > path.win32.sep '\\' > path.win32.join('\tmp', 'demo') '\\tmp\\demo' > path.win32.join('/tmp', 'demo') '\\tmp\\demo'
path.delimiter
linux系统例子:
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系统例子:
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\\']
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
위 내용은 Node.js의 경로 처리 모듈 경로 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!