Как определить разделитель путей к ОС в JavaScript?

82

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

Панг
источник
Зачем это нужно, когда Javascript запускается внутри браузера с полной изоляцией ОС? Вы не можете получить доступ к файлам со своего локального компьютера ...
lms,
JavaScript обычно, но не всегда, запускается в браузере. Некоторыми примерами использования JavaScript вне браузера являются приложения Mozilla XULRunner, сценарии js, запускаемые с использованием интерпретатора командной строки, например V8 или WSH, и страницы ASP, написанные на JScript. JS можно использовать по-разному.
Джоэл Анаир,
Я уверен, что вы уже решили проблему, но я добавил вариант использования для вашего вопроса и ответ ниже, потому что, как и вы, я знаю, что всегда есть случай, когда вы не можете полагаться на ОС в решении проблемы разделитель для тебя! :). Ура!
Декодировано
2
Этот вопрос очень актуален, потому что JavaScript часто запускается внутри Node.js. Там вы можете и хотите получить доступ к файловой системе, поэтому разделитель путей имеет значение. Это также одна из проблемных точек, если вы хотите создавать приложения Node.js для нескольких ОС. Node.js является мультиплатформенным, но это не означает, что любая программа Node.js работает во всех поддерживаемых ОС, без особого внимания к используемым путям к файлам.
Panu Logic

Ответы:

20

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

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

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

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

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

ВВС
источник
1
Ответ VVS правильный, за исключением анализа пути, заданного вводом файла в Internet Explorer (протестировано с IE8 - я не знаю о других версиях). В этом случае путь, заданный значением входного элемента (input.value), имеет форму «C: \ fakepath \ & lt; filename & gt;». Обратите внимание на обратную косую черту здесь.
Milagre 01
JFYI: cmd.exe правильно обрабатывает "cd / windows" (в качестве примера) как в Windows XP, так и в Windows 7.
Обратный звонок Евгения Маевски
2
Это не полностью ПРАВИЛЬНЫЙ ответ на поставленный вопрос ... см. «Правильный ответ» ниже :).
Декодировано
5
Я отклонил этот ответ, потому что он игнорирует безупречную обоснованность вопроса, а именно, что есть случаи, когда вам действительно нужно знать используемый разделитель путей. Например, если нужно разделить путь на части, будет использоваться разделитель.
MirroredFate
2
@VVS - не работает в сценариях, где вы используете оба типа косой черты (по крайней мере, в Windows 7). Рассмотрим случай, когда вы создаете переменную с использованием __dirname, а затем вам нужно добавить оставшуюся часть пути. Например: __dirname + '/ images'. В этом примере __dirname будет использовать косые черты ОС, но если вы попытаетесь использовать / images и находитесь в Windows, у вас будет путь вроде c: \ somepath / images, и он не будет работать в Windows. Я просто столкнулся с этим случаем, поэтому и упоминаю его :).
dcp
160

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

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

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

const path = require('path')
t98907
источник
2
Вы можете улучшить ваш ответ с указанием , как:path.sep .
Ionică Bizău
11
const path = require('path');
Sebas
Хотя я знаю, что могу использовать '/' в большинстве, если не во всех случаях. Когда я печатаю вывод на консоль для обратной связи или регистрации. Мне нравится использовать одни и те же косые черты в полном пути.
b01
Я думаю, что это правильный ответ, а также самое простое решение. Как указал Себас, чтобы получить доступ к модулю пути, вы должны сделать path = require ('path'). Если вы программист Node. даже новичок, вы, вероятно, уже это знаете.
Panu Logic
7

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

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

Очевидное «Да!» Вопрос

Что происходит, когда вы зависите, например, от каталога установки %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

И это все!

Расшифровано
источник
1
Мне нравится, что вы представили логику поиска используемого разделителя, разбив его на управляемые части. Так профессионал работает инженером. +1 за это. Кроме того, учитывая возраст вопроса и отсутствие NodeJSтега - вы ответили как на стороне сервера, так и на стороне клиента . Ваш ответ полностью - и фактически - отвечает на вопрос. Для узла, я думаю, подойдет модуль пути, потому что он не повлияет на производительность сгенерированного байт-кода и не должен повлиять на читаемость (один оператор импорта). Однако вы единственный ответ на стороне клиента. Это должно быть принято.
Rik
1

Как уже было сказано здесь, вы можете найти разделитель путей для ОС, path.joinчтобы вручную создать свой путь. Но вы также можете позволить 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

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

Винсент Макнабб
источник
4
ОП спросил как determine, а не какой оператор работает везде :-)
Steel Brain
3
Он работает, когда вам нужно проанализировать путь, чтобы что-то извлечь.
Chris