Як я можу сказати в 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 .. незалежно від того, як ви передаєте в сепаратори. Але як щодо читання шляху назад. Як би ви знали, якщо в ньому сказано "віконний" шлях, з ' '
і \
дозволений.
Що відбувається, коли ви залежате, наприклад, від каталогу інсталяції %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
in 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
, а не те, який оператор працює скрізь :-)