web-dev-qa-db-ja.com

パスが絶対パスか相対パスかを確認する方法

UNIXの絶対パスは「/」で始まりますが、Windowsはアルファベットの「C:」または「\」で始まります。 node.jsには、パスが絶対パスか相対パスかを確認する標準のマルチプラットフォーム関数がありますか?

28
Manuel Di Iorio

ノードバージョン0.12.0以降、 path モジュールの path.isAbsolute(path) 関数を使用できます。

つまり:

var path = require('path');
if(path.isAbsolute(myPath)) {
    //...
}
29
chresse

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+'$'), '' );
9
peoro

あなたは使うことができます

path.resolve(yourPath)===yourPath

パスが正規化されていない場合は、

path.resolve( yourPath ) == path.normalize( yourPath )
9
Denys Séguret

これは少し複雑ですが、(pre node 0.12.0)パスモジュールだけを使用して見つけた最も堅牢な方法

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

Path.isAbsoluteはノード0.12.0以降に存在することに注意してください。

3
TomDotTom

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) === '/';
};
1
Javier Ros
    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))

この部分は、パス文字列が「./」または「../」または「〜/」で始まるかどうかを確認します。含まれている場合は、ブール値trueが返されます。そうでなければ、次のテストが実行されます。

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

これは、パス文字列に「/./」または「/../」が含まれているかどうかを確認するだけです。いずれかでtrueを返し、どちらでもfalseを返します。

2つのテストのいずれかが真の場合、パス文字列は相対です。

ウィンドウ用。

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