Как определить разделитель пути ОС в JavaScript? - PullRequest
50 голосов
/ 24 сентября 2008

Как я могу сказать в JavaScript, какой разделитель путей используется в ОС, где выполняется скрипт?

Ответы [ 5 ]

101 голосов
/ 23 февраля 2013

Использовать модуль path в node.js возвращает разделитель файлов для конкретной платформы.
Пример

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

Редактировать: В соответствии с комментарием Себаса ниже, чтобы использовать это, вам нужно добавить это вверху вашего файла js:

const path = require('path')
19 голосов
/ 24 сентября 2008

На самом деле вы всегда можете использовать / в качестве разделителя пути, даже в Windows.

Цитата из http://bytes.com/forum/thread23123.html:

Итак, ситуацию можно подвести довольно просто:

  • Все службы DOS начиная с DOS 2.0 и все API-интерфейсы Windows принимают либо пересылку косая черта или обратная косая черта. Всегда имейте.

  • Ни одна из стандартных командных оболочек (CMD или COMMAND) не будет принимать пересылку косая черта. Даже пример "cd ./tmp" дано в предыдущем посте неудачно.

4 голосов
/ 01 августа 2010

Ответ VVS является правильным, за исключением анализа пути, заданного файловым вводом в Internet Explorer (протестировано с IE8 - я не знаю о других версиях). В этом случае путь, заданный значением входного элемента (input.value), имеет вид «C: \ fakepath \ ». Обратите внимание на обратную косую черту здесь.

3 голосов
/ 06 февраля 2016

Правильный ответ

Да все ОС принимают CD ../ или CD .. \ или CD .. независимо от того, как вы переходите в разделители. Но как насчет чтения пути назад. Как бы вы узнали, если это, скажем, путь "windows", с разрешенными ' ' и \.

Очевидное 'Дух!' Вопрос

Что происходит, когда вы зависите, например, от каталога установки %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('/') равно -1 в C:\Program Files\Notepad\Notepad++.exe), что приводит к пустой строке.

Решение ...

Сюда входит код из следующего поста: Как определить текущую операционную систему с Node.js

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

Обнаружение ОС на стороне сервера.

// 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; }

Обнаружение на стороне браузера ОС

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

И это все люди!

0 голосов
/ 24 сентября 2008

Просто используйте "/", насколько мне известно, он работает на всех ОС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...