Як визначити роздільник шляху ОС в JavaScript?


82

Як я можу сказати в JavaScript, який роздільник шляху використовується в ОС, де працює сценарій?


Навіщо це потрібно, коли Javascript запускається всередині браузера з повною ізоляцією ОС? Ви не можете отримати доступ до файлів з локального комп’ютера ...
lms

JavaScript, як правило, але не завжди, працює у браузері. Деякі приклади використання JavaScript за межами браузера - це програми Mozilla XULRunner, скрипти js, що виконуються з використанням інтерпретатора командного рядка, наприклад V8 або WSH, та сторінки ASP, написані на JScript. Існує багато застосувань для JS.
Joel Anair

Я впевнений, що ви вже вирішили проблему, але я додав варіант використання для вашого запитання та відповіді нижче, оскільки, як і ви, я знаю, що завжди є випадок, коли ви не можете залежати від ОС, щоб вирішити проблему. сепаратор для вас! :). На здоров’я!
Розшифровано

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; ім'я файлу & gt;". Зверніть увагу на зворотні скісні риски тут.
Milagre

JFYI: cmd.exe правильно обробляє "cd / windows" (як приклад) як на Windows XP, так і на Windows 7.
Зворотній дзвінок Євгена Маєвського

2
Це не повністю ПРАВИЛЬНА відповідь на поставлене питання ... див. "Правильна відповідь" нижче :).
Розшифровано

5
Я підтримав цю відповідь, оскільки вона ігнорує повну обгрунтованість запитання, а саме: існують випадки, коли вам насправді потрібно знати, як використовується розділювач шляхів. Наприклад, необхідність розділити контур на шматки використовуватиме роздільник.
MirroredFate

2
@VVS - Не працює в сценаріях, коли ви використовуєте обидва типи косих рисок (принаймні в Windows 7). Розглянемо випадок, коли ви створюєте змінну за допомогою __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')

2
Ви можете поліпшити ваш відповідь з вказівкою , як:path.sep .
Ionică Bizău

11
const path = require('path');
Себас,

Хоча я знаю, що можу використовувати '/' у більшості, якщо не у всіх випадках. Коли я друкую вихідні дані на консолі для зворотного зв'язку або реєстрації. Мені подобається використовувати ті самі косі риси на повному шляху.
b01

Я думаю, що вище - правильна відповідь, а також найпростіше рішення. Як зазначив Себас, щоб отримати доступ до модуля path, ви повинні зробити path = require ('path'). Якщо ви програміст Node., навіть новачок, ви, напевно, це вже знаєте.
Panu Logic

7

Правильна відповідь

Так, усі ОС приймають компакт-диск ../ або 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('/')є -1in 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тегу - ви відповіли як на стороні сервера, так і на стороні клієнта . Ваша відповідь відповідає повністю - і насправді - відповідає на питання. Що стосується вузла, я думаю, що модуль шляху є нормальним, оскільки він не вплине на продуктивність генерованого байт-коду і не повинен впливати на читабельність (один імпорт). Однак ви єдина відповідь на стороні клієнта. Це має бути прийнятим.
Рік

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 Seufert
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.