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.