node.js에서 path.join을 사용해야합니까?


134

누구나 알고 있듯이 Windows는 백 슬래시로 경로를 수행하고 Unix는 슬래시로 경로를 수행합니다. node.js는 path.join()항상 올바른 슬래시를 사용하도록 제공 합니다. 예를 들어 유닉스를 쓰는 대신에 'a/b/c'당신이 path.join('a','b','c')대신 할 것입니다.

그러나이 차이에도 불구하고 경로를 정규화하지 않고 (예 : path.join 사용) a/b/cnode.js 와 같은 경로를 작성하면 Windows에서 스크립트를 실행하는 데 아무런 문제가없는 것 같습니다 .

덮어 쓰는 것 path.join('a','b','c')보다 이점 이 'a/b/c'있습니까? 둘 다 플랫폼에 관계없이 작동하는 것으로 보입니다 ...

답변:


106

Windows 파일 시스템은 슬래시를 경로 구분 기호로 사용하는 데 아무런 문제가 없습니다 (DOS 시절부터 그랬습니다). 유일한 문제는 Windows 명령 줄 프로세서 (또는보다 구체적으로 Windows 기본 명령 줄 유틸리티)가 슬래시를 경로 구성 요소가 아닌 옵션 지정자로 해석하는 경향이 있다는 것입니다. 따라서 서브 프로세스로 실행되는 Windows 명령에 경로를 전달해야하는 경우 백 슬래시 경로가 필요합니다. 또한 경로를 반환하는 Windows API 호출 (및 Windows API를 호출하는 고급 언어의 메서드)은 백 슬래시를 사용하므로 하위 프로세스로 전달하지 않더라도 정규화해야합니다.


슬래시도 UNC 경로를 손상시킵니다.
user2426679

이 답변은 일반적인 Node.js 앱에서 왜 사용하는지 명확하지 않습니다. 아니면 어쩌면 그것을 얻지 못했을 수도 있습니다. 재미 있었지만.
Gherman

96

path.join 주어진 경로가 알 수없는 출처 (예 : 사용자 입력, 타사 API 등)에서 온 경우 발생할 수있는 불필요한 구분 기호를 처리합니다.

그래서 path.join('a/','b') path.join('a/','/b'), path.join('a','b')그리고 path.join('a','/b')모든 줄 것이다 a/b.

그것을 사용하지 않으면, 일반적으로 슬래시가 없거나 하나만 있다는 것을 알면서 결합 된 경로의 시작과 끝에 대해 ​​기대하게됩니다.


그것은 약간 유용하지만 알 수없는 출처에서 임의의 확인되지 않은 경로를 수신하는 것은 큰 보안 문제처럼 들립니다. 그것은 자주 할 일이 아닙니다.
Gherman

50

내가 사용 path.join구분이 올바른 장소에있는 폴더를 보장하기 위해 반드시이 백 슬래시 대 앞으로 사용하도록 할 수 있습니다. 예를 들면 다음과 같습니다.

path.join("/var/www", "test")

www와 테스트 사이에 구분 기호를 올바르게 삽입합니다 /var/www/test


2
나는이 점을 이해하지 못한다. 해당 스크립트가 변수에 있다면 슬래시를 수동으로 추가하지 않는 이유는 무엇입니까?
mgol

2
또한이 답변을 이해하는 데 어려움이 있습니다. 값을 볼 수 없습니다.
oligofren

23
다른 소스에서 얻은 경로 값에 슬래시가 있는지 여부가 항상 확실하지 않기 때문입니다. 위의 예가 고안되었습니다. 이러한 경로는 종종 하드 코딩되지 않지만 다른 구성 파일, 사용자 입력, 라이브러리 등에서 가져옵니다.
Timothy Strimple

@TimothyStrimple ~ 사용하기 좋은 곳 path.join은 여기에 다른 대답이 될 것입니다 stackoverflow.com/questions/9027648/… . 그 대답은 나를 스스로 대답하는 또 다른 질문으로 이끌었습니다. :
Pebbl

23
나는 또한 5 분 후에 내 코드가 폭발 할 때까지 그 대답에 대해 회의적이었다 return baseDir + relativePath + filename;. 바로 교체했습니다 return path.join(baseDir, relativePath, filename);. 정말 도움이됩니다!
Pedro

34

짧은 답변:

모든 fs.*기능 (예 : fs.open등)이 경로 이름을 처리합니다. 따라서 path.join자신 을 사용 하고 코드를 읽을 수 없게 만들 필요는 없습니다 .

긴 대답 :

백 슬래시 또는 슬래시 를 고려한 Windows 용 특수 RegExps가 있는 모든 fs.*함수 호출이 호출 됩니다. 다음에서 소스 코드를보고 직접 확인할 수 있습니다.path._makeLong(path)path.resolve(path)\/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.