JavaScript에서 OS 경로 구분 기호를 결정하는 방법은 무엇입니까?


82

스크립트가 실행되는 OS에서 사용되는 경로 구분 기호를 JavaScript에서 어떻게 알 수 있습니까?


Javascript가 완전한 OS 격리로 브라우저 내에서 실행될 때 왜 이것이 필요합니까? 로컬 컴퓨터에서 파일에 액세스 할 수 없습니다 ...
lms

JavaScript는 일반적으로 브라우저에서 실행되지만 항상 그런 것은 아닙니다. 브라우저 외부에서 JavaScript를 사용하는 몇 가지 예는 Mozilla XULRunner 앱, V8 또는 WSH와 같은 명령 줄 인터프리터를 사용하여 실행되는 js 스크립트, JScript로 작성된 ASP 페이지입니다. JS에는 많은 용도가 있습니다.
Joel Anair

이미 문제를 해결했다고 확신하지만 질문에 대한 사용 사례와 아래에 답변을 추가했습니다. 귀하와 마찬가지로 문제를 해결하기 위해 OS에 의존 할 수없는 경우가 항상 있다는 것을 알고 있기 때문입니다. 당신을 위해 분리기! :). 건배!
디코딩

2
JavaScript가 종종 Node.js 내에서 실행되기 때문에이 질문은 매우 관련이 있습니다. 경로 구분자가 중요하도록 파일 시스템에 액세스 할 수 있고 액세스 할 수 있습니다. 이것은 또한 다중 OS Node.js 애플리케이션을 생성하려는 경우 고충 점 중 하나입니다. Node.js는 다중 플랫폼이지만 사용하는 파일 경로에 특별한주의를 기울이지 않고 Node.js 프로그램이 지원되는 모든 OS에서 실행된다는 의미는 아닙니다.
Panu Logic

답변:


20

Afair는 Windows에서도 항상 경로 구분 기호로 /를 사용할 수 있습니다.

http://bytes.com/forum/thread23123.html 에서 인용 :

따라서 상황은 간단하게 요약 할 수 있습니다.

  • DOS 2.0 이후의 모든 DOS 서비스와 모든 Windows API는 슬래시 또는 백 슬래시를 허용합니다. 항상 있습니다.

  • 표준 명령 셸 (CMD 또는 COMMAND)은 슬래시를 허용하지 않습니다. 이전 게시물에서 제공된 "cd ./tmp"예제조차도 실패합니다.


1
VVS의 대답은 정확합니다. 단, 인터넷 익스플로러에서 파일 입력에 의해 주어진 경로를 파싱하는 것을 제외하고는 (IE8로 테스트했습니다-다른 버전에 대해서는 모릅니다). 이 경우 입력 요소의 값 (input.value)이 제공하는 경로는 "C : \ fakepath \ & lt; filename & gt;"형식입니다. 여기서 백 슬래시에 유의하십시오.
Milagre

JFYI : cmd.exe는 Windows XP와 Windows 7 모두에서 "cd / windows"(예 : 예)를 올바르게 처리합니다.
Eugene Mayevski '콜백'2011

2
이것은 제기 된 질문에 대한 완전한 정답이 아닙니다 ... 아래 "정답"을 참조하십시오. :).
디코딩 됨

5
나는이 대답이 질문의 완벽한 타당성을 무시하기 때문에 반대표를 던졌습니다. 예를 들어 경로를 여러 조각으로 분할해야하는 경우 구분 기호를 사용합니다.
MirroredFate

2
@VVS-두 가지 유형의 슬래시를 모두 사용하는 시나리오에서는 작동하지 않습니다 (적어도 Windows 7에서는). __dirname을 사용하여 변수를 생성 한 다음 나머지 경로를 추가해야하는 경우를 고려하십시오. 예 : __dirname + '/ images'. 이 예제에서 __dirname은 OS 특정 슬래시를 사용하지만 / images를 사용하려고 시도하고 Windows를 사용하는 경우 c : \ somepath / images와 같은 경로로 끝나고 Windows에서는 작동하지 않습니다. 나는 방금이 사건을 만났기 때문에 그것을 언급했습니다. :).
dcp

160

path모듈 사용 node.js은 플랫폼 별 파일 구분자 를 반환합니다.

path.sep  // on *nix evaluates to a string equal to "/"

편집 : 아래 Sebas의 설명에 따라 이것을 사용하려면 js 파일 상단에 다음을 추가해야합니다.

const path = require('path')

2
방법을 지정path.sep 하여 답변 개선 할 수 있습니다..
Ionică Bizău 2015 년

11
const path = require('path');
Sebas

모든 경우는 아니지만 대부분의 경우 '/'를 사용할 수 있다는 것을 알고 있습니다. 피드백 또는 로깅을 위해 콘솔에 출력을 인쇄 할 때. 전체 경로에 동일한 슬래시를 사용하고 싶습니다.
b01

나는 위가 정답이자 가장 간단한 해결책이라고 생각합니다. 경로 모듈에 액세스하려면 Sebas가 지적한대로 path = require ( 'path')를 수행해야합니다. Node. 프로그래머라면 초보자라도 이미 알고있을 것입니다.
Panu Logic

7

정답

모든 OS는 구분 기호를 전달하는 방법에 관계없이 CD ../ 또는 CD .. \ 또는 CD ..를 허용합니다. 그러나 경로를 다시 읽는 것은 어떻습니까? '창'경로가 포함되어 ' '있고 \허용 되는지 어떻게 알 수 있습니까 ?

명백한 'Duh!' 질문

예를 들어 설치 디렉토리에 의존하면 어떻게됩니까 %PROGRAM_FILES% (x86)\Notepad++? 다음 예를 살펴보십시오.

var fs = require('fs');                             // file system module
var targetDir = 'C:\Program Files (x86)\Notepad++'; // target installer dir

// read all files in the directory
fs.readdir(targetDir, function(err, files) {

    if(!err){
        for(var i = 0; i < files.length; ++i){
            var currFile = files[i];

            console.log(currFile); 
            // ex output: 'C:\Program Files (x86)\Notepad++\notepad++.exe'

            // attempt to print the parent directory of currFile
            var fileDir = getDir(currFile);

            console.log(fileDir);  
            // output is empty string, ''...what!?
        }
    }
});

function getDir(filePath){
    if(filePath !== '' && filePath != null){

       // this will fail on Windows, and work on Others
       return filePath.substring(0, filePath.lastIndexOf('/') + 1);
    }
}

어떻게 된 거예요!?

targetDir이 인덱스 사이의 하위 문자열로 설정 0되고 0( indexOf('/')is -1in C:\Program Files\Notepad\Notepad++.exe), 결과적으로 빈 문자열이됩니다.

해결책...

여기에는 다음 게시물의 코드가 포함됩니다. 됩니다. Node.js로 현재 운영 체제를 확인하는 방법

myGlobals = { isWin: false, isOsX:false, isNix:false };

OS의 서버 측 감지.

// this var could likely a global or available to all parts of your app
if(/^win/.test(process.platform))     { myGlobals.isWin=true; }
else if(process.platform === 'darwin'){ myGlobals.isOsX=true; }
else if(process.platform === 'linux') { myGlobals.isNix=true; }

브라우저 측 OS 감지

var appVer = navigator.appVersion;
if      (appVer.indexOf("Win")!=-1)   myGlobals.isWin = true;
else if (appVer.indexOf("Mac")!=-1)   myGlobals.isOsX = true;
else if (appVer.indexOf("X11")!=-1)   myGlobals.isNix = true;
else if (appVer.indexOf("Linux")!=-1) myGlobals.isNix = true;

구분자를 가져 오는 도우미 함수

function getPathSeparator(){
    if(myGlobals.isWin){
        return '\\';
    }
    else if(myGlobals.isOsx  || myGlobals.isNix){
        return '/';
    }

    // default to *nix system.
    return '/';
}

// modifying our getDir method from above...

상위 디렉토리를 가져 오는 도우미 기능 (플랫폼 간)

function getDir(filePath){
    if(filePath !== '' && filePath != null){
       // this will fail on Windows, and work on Others
       return filePath.substring(0, filePath.lastIndexOf(getPathSeparator()) + 1);
    }
}

getDir() 무엇을 찾고 있는지 알 수있을만큼 똑똑해야합니다.

사용자가 명령 줄 등을 통해 경로를 입력하고 있는지 정말 매끄럽게 확인하고 둘 다 확인할 수 있습니다.

// in the body of getDir() ...
var sepIndex = filePath.lastIndexOf('/');
if(sepIndex == -1){
    sepIndex = filePath.lastIndexOf('\\');
}

// include the trailing separator
return filePath.substring(0, sepIndex+1);

이 간단한 작업을 수행하기 위해 모듈을로드하려면 위에서 설명한대로 'path'모듈과 path.sep를 사용할 수도 있습니다. 개인적으로 이미 사용 가능한 프로세스의 정보를 확인하는 것으로 충분하다고 생각합니다.

var path = require('path');
var fileSep = path.sep;    // returns '\\' on windows, '/' on *nix

그리고 그게 전부입니다!


1
사용할 구분 기호를 찾아 관리 가능한 덩어리로 나누는 논리를 제시 한 것이 좋습니다. 이것이 전문가가 엔지니어로 일하는 방식입니다. +1 . 또한 질문의 나이와 NodeJS태그 의 부족을 고려하여 서버클라이언트 측 모두에 대해 답변했습니다 . 귀하의 답변은 질문에 대해 완전하고 실제로 답변합니다. 노드의 경우 경로 모듈이 생성 된 바이트 코드 성능에 영향을 미치지 않고 가독성 (단일 가져 오기 문)에 영향을주지 않기 때문에 괜찮다고 생각합니다. 그러나 당신은 클라이언트 측에 대한 유일한 대답입니다. 이것은 받아 들여 져야합니다.
Rik

1

여기에서 이미 답변했듯이 경로 path.join를 수동으로 구성 하는 데 사용 되는 OS 별 경로 구분 기호를 찾을 수 있습니다 . 그러나 path.join경로 구성을 다룰 때 선호하는 솔루션 인 작업을 수행 할 수도 있습니다 .

예:

const path = require('path');

const directory = 'logs';
const file = 'data.json';

const path1 = `${directory}${path.sep}${file}`;
const path2 = path.join(directory, file);

console.log(path1); // Shows "logs\data.json" on Windows
console.log(path2); // Also shows "logs\data.json" on Windows

-3

"/"를 사용하면 내가 아는 한 모든 OS에서 작동합니다.


4
영업 이익은 질문 방법 determine, :-) 모든 곳에서 일하는 작업자의하지 무엇을
스틸 뇌

3
무언가를 추출하기 위해 경로를 구문 분석해야하는 유틸리티로 작동합니다.
크리스 Seufert
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.