머리말
node.js에서는 경로를 처리하고 변환하는 데 사용할 수 있는 많은 메서드와 속성이 제공됩니다. 경로 인터페이스는 용도에 따라 분류됩니다. .. 잘 생각해보면 그렇게 헷갈리지는 않을 것이다. 아래에서는 Node.js의 경로 처리 모듈 경로를 자세히 소개하겠습니다.
경로/파일 이름/확장자 가져오기
경로 가져오기: path.dirname(filepath)
파일 이름 가져오기: path.basename(filepath )
확장자 가져오기: path.extname(filepath)
경로 가져오기
예제는 다음과 같습니다.
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])
경로를 함께 모은 다음 정규화합니다. 이 문장은 어차피 나로서는 이해할 수 없다. 아래 의사코드 정의를 참고하면 된다.
예는 다음과 같습니다.
var path = require('path'); // 输出 '/foo/bar/baz/asdf' path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
경로 정의의 의사코드는 다음과 같습니다.
module.exports.join = function(){ var paths = Array.prototye.slice.call(arguments, 0); return this.normalize( paths.join('/') ); };
path.resolve([...paths])
이 인터페이스에 대한 설명은 약간 장황합니다. 쉘 아래에서 왼쪽에서 오른쪽으로 cd 경로 명령을 실행하고 있으며 최종적으로 얻은 절대 경로/파일 이름이 이 인터페이스에서 반환된 결과라고 상상할 수 있습니다.
예를 들어 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 설명이 너무 짧고 다음 내용이 포함되어 있습니다.
경로가 비어 있으면 return.(현재 작업 경로와 동일)
경로에서 반복되는 경로 구분 기호(예: Linux의 /)를 하나로 병합합니다.
경로에서 ., ..를 처리합니다. (셸의 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): 루트, dir, 베이스를 변환합니다. pathObject , name 및 ext 속성은 특정 규칙에 따라 파일 경로로 결합됩니다.
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 더욱 간소화될 수 있습니다.
인터페이스 설명에 따르면 다음 두 가지는 동일합니다.
루트 대 dir: 둘은 서로 교체될 수 있습니다. 차이점은 경로를 연결할 때 루트 뒤에 /가 자동으로 추가되지 않지만 dir은 자동으로 추가된다는 것입니다.
기본 vs 이름+내선: 둘은 서로 교체될 수 있습니다.
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가 비어 있으면 현재 작업 경로를 반환합니다.
위의 예:
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\\']