Как определить разделитель пути к операционной системе в JavaScript?
-
02-07-2019 - |
Вопрос
Как я могу определить в JavaScript, какой разделитель путей используется в операционной системе, на которой выполняется скрипт?
Решение
Afair вы всегда можете использовать / в качестве разделителя путей, даже в Windows.
Цитата из http://bytes.com/forum/thread23123.html:
Итак, ситуацию можно резюмировать довольно просто:
Все службы DOS начиная с DOS 2.0 и все API Windows принимают либо прямую косую черту, либо обратную.Всегда так было.
Ни одна из стандартных командных оболочек (CMD или COMMAND) не принимает прямые косые черты.Даже пример "cd ./ tmp" , приведенный в предыдущем сообщении, не работает.
Другие советы
Использование path
модуль в node.js
возвращает разделитель файлов, зависящий от платформы.
пример
path.sep // on *nix evaluates to a string equal to "/"
Редактировать:Согласно комментарию Себаса ниже, чтобы использовать это, вам нужно добавить это в начало вашего js-файла:
const path = require('path')
Правильный Ответ
ДА все операционные системы принимают 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
И Это все, Ребята!
Ответ VVS правильный, за исключением синтаксического анализа пути, заданного при вводе файла в Internet Explorer (тестировался с IE8 - я не знаю о других версиях).В этом случае путь, заданный значением входного элемента (input.value), имеет вид "C:\fakepath\<filename>".Обратите внимание на обратную косую черту здесь.
Просто используйте "/", это работает на всех ОС, насколько я знаю.