2014-02-11 3 views
18

Абсолютный путь UNIX начинается с '/', тогда как Windows начинается с алфавита 'C:' или '\'. Имеет ли node.js стандартную мультиплатформенную функцию, чтобы проверить, является ли путь абсолютным или относительным?Как проверить, является ли путь абсолютным или относительным

ответ

19

Это немного поздно но для других пользователей по той же проблеме:

с версии узла 0.12.0 вы можете использовать функцию path.isAbsolute(path) из модуля path.

т.е.

var path = require('path'); 
if(path.isAbsolute(myPath)) { 
    //... 
} 
+0

Обратите внимание, что isAbsolute, кажется, возвращает true для любого пути, начинающегося с /, будь то в Windows или Mac (не уверен о * nix) –

8

Вы можете использовать

path.resolve(yourPath)===yourPath 

Если ваш путь не нормируется, используйте

path.resolve(yourPath) == path.normalize(yourPath) 
+3

Там также функция isAbsolute в источнике, даже если я не найти его в документации, и это, кажется, не будут доступны: https://github.com/joyent/node/blob/master/ lib/path.js # L206 –

+0

Да, я не знаю, почему этого не происходит в документе, но пока думаю, что я буду использовать ваш ответ для обеспечения безопасности. –

+2

@ManuelDiIorio [related] (https://github.com/joyent/node/issues/6705) –

1

Я понятия не имею о Node.js, но вы можете увидеть источник path.js в GitHub: https://github.com/joyent/node/blob/master/lib/path.js

Вы можете увидеть:

// windows version 
exports.isAbsolute = function(path) { 
    var result = splitDeviceRe.exec(path), 
    device = result[1] || '', 
    isUnc = device && device.charAt(1) !== ':'; 
    // UNC paths are always absolute 
    return !!result[2] || isUnc; 
}; 

А:

// posix version 
exports.isAbsolute = function(path) { 
    return path.charAt(0) === '/'; 
}; 
8

Как прокомментировал ответ dystroy, в предлагаемые решения не работают, если абсолютный путь уже не нормализованы (например, путь: ///a//..//b//./).

Правильное решение:

path.resolve(yourPath) === path.normalize(yourPath) 

Как Marc Diethelm предлагает в комментариях, это есть еще некоторые проблемы, так как path.resolve удаляет слешей пока path.normalize нет.

Я не знаю, как они функционируют так же ведут себя (как вы можете прочитать в комментариях), в любом случае следующий фрагмент кода, кажется, работает хорошо, по крайней мере в среде Linux:

path.resolve(yourPath) === path.normalize(yourPath).replace(RegExp(path.sep+'$'), ''); 
+1

Однако, поскольку 'normalize' сохраняет конечные косые черты, ваше решение должно быть расширено.' path.resolve (_yourPath) == = path.normalize (_yourPath) .replace (/ [\/| \\] $ /, '') ', будет работать надежно. –

+0

@MarcDiethelm: вы очень правы, я никогда не замечал. ответ с учетом вашего предложения! В любом случае ваше решение все еще не работает «отлично работает, например, с ошибкой«/\\ ». Есть ли какая-либо конкретная причина для удаления задней обратной косой черты? Поддерживает ли Windows пути или что еще? – peoro

+0

. Проверка подлинности обратной косой черты необходима для Windows. re: он не работает с '/ \\'. Я не понимаю, вы можете сделать это? Это должен быть путь, который вы проверяете ?! –

3

Это немного запутанным, но самый надежный способ я нашел, используя только (узел предварительной 0.12.0) модуль пути

function isAbsolute(p) { 
    return path.normalize(p + '/') === path.normalize(path.resolve(p) + '/'); 
} 

Это должно быть отметил, что path.isAbsolute существует с узла 0.12.0 и далее.

+0

Кажется довольно твердым –

0
isRelative(url){ 
     return (/^(\.){1,2}(\/){1,2}$/.test(url.slice(0,3)) || 
     /(\/){1,2}(\.){1,2}(\/){1,2}/.test(url)); 
    } 

Это позволяет легко проверить, является ли путь относительным, несмотря на отсутствие API-интерфейса узла пути.

(/^(\.|~){1,2}(\/){1,2}$/.test(url.slice(0,3)) 

проверяет эту часть, если строка путь начинается с «./» или «../» или „~ /“. Если это так, возвращается Boolean true. В противном случае выполняется следующий тест.

/(\/){1,2}(\.){1,2}(\/){1,2}/.test(url) 

Это просто проверяет, имеет ли строка пути «/./» или «/../». и возвращает true для любого и false для них.

Если какой-либо из двух тестов истинен, строка пути относительна.

Для окон.

isRelative(url){ 
     return (/^(\.){1,2}(\\){1,2}$/.test(url.slice(0,3)) || 
     /(\\){1,2}(\.){1,2}(\\){1,2}/.test(url)); 
    } 
+1

Пожалуйста, объясните, что вы сделали. –

Смежные вопросы