Как я могу узнать в JavaScript, какой разделитель пути используется в ОС, в которой выполняется скрипт?
Как я могу узнать в JavaScript, какой разделитель пути используется в ОС, в которой выполняется скрипт?
Ответы:
Вы всегда можете использовать / в качестве разделителя путей, даже в 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')
path.sep
.
const path = require('path');
Да, все ОС принимают 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
NodeJS
тега - вы ответили как на стороне сервера, так и на стороне клиента . Ваш ответ полностью - и фактически - отвечает на вопрос. Для узла, я думаю, подойдет модуль пути, потому что он не повлияет на производительность сгенерированного байт-кода и не должен повлиять на читаемость (один оператор импорта). Однако вы единственный ответ на стороне клиента. Это должно быть принято.
Как уже было сказано здесь, вы можете найти разделитель путей для ОС, 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
Просто используйте "/", насколько я знаю, он работает на всех ОС.
determine
, а не какой оператор работает везде :-)