node.jsでpath.joinを使用する必要がありますか?


134

誰もが知っているように、Windowsはバックスラッシュを使用してパスを実行しますが、Unixはフォワードスラッシュを使用してパスを実行します。node.jsはpath.join()常に正しいスラッシュを使用するために提供します。したがって、たとえば、Unixを作成する代わりに、代わりに'a/b/c'行うだけですpath.join('a','b','c')

ただし、この違いにもかかわらず、パスを正規化せず(たとえば、path.joinを使用)、a/b/cnode.jsのようなパスを書き込むだけであれば、Windowsでスクリプトを実行しても問題はないようです。

だから、書きかけの任意の利点があるpath.join('a','b','c')以上は'a/b/c'?どちらもプラットフォームに関係なく動作するようです...

回答:


106

Windowsファイルシステムでは、スラッシュをパスの区切り文字として使用しても問題はありません(これは、DOS時代からのことです)。唯一の実際の問題は、Windowsコマンドラインプロセッサ(より具体的には、Windowsネイティブのコマンドラインユーティリティ)が、スラッシュをパスコンポーネントではなくオプション指定子として解釈する傾向があることです。したがって、サブプロセスとして実行されるWindowsコマンドにパスを渡す必要がある場合は、円記号付きのパスが必要です。また、パスを返すWindows API呼び出し(およびWindows APIを呼び出す高水準言語のメソッド)はバックスラッシュを使用するため、サブプロセスにパスを渡さなくても、それらを正規化する必要があります。


スラッシュもUNCパスを壊します。
user2426679 2017年

この回答では、典型的なNode.jsアプリでそれを使用する理由が明確にされていません。それとも、私がそれを取得していないだけなのかもしれません。面白かったけど。
ガーマン

96

path.join 指定されたパスが不明なソース(ユーザー入力、サードパーティのAPIなど)からのものである場合に発生する可能性がある不要な区切り文字を処理します。

だからpath.join('a/','b') path.join('a/','/b')path.join('a','b')そしてpath.join('a','/b')すべてが与えるでしょうa/b

これを使用しない場合、通常、パスがスラッシュを1つも持たないか知っているため、結合されたパスの開始と終了を予想します。


これは少し便利に聞こえますが、未知のソースから任意の未チェックのパスを受信すると、大きなセキュリティ問題のように聞こえます。それは頻繁に行うことではありません。
ガーマン

50

私が使用しpath.join、それがバックスラッシュに対して前方に使用していることを保証するために、必ずしも、フォルダの区切りが正しい場所にあることを確認します。例えば:

path.join("/var/www", "test")

wwwとテストの間にセパレータを正しく挿入します /var/www/test


2
この点がわかりません。これらのスクリプトが変数に含まれている場合は、手動でスラッシュを追加しないでください。
mgol 2013

2
私もこの答えを理解するのに苦労しています。値が表示されません。
オリゴフレン2014

23
他のソースから取得したパスの値に末尾のスラッシュがあるかどうかは常にわからないからです。上記の例は人為的なものです。多くの場合、これらのパスはハードコードされていないが、他の設定ファイル、ユーザー入力、ライブラリなどから引っ張られている
ティモシーStrimple

@TimothyStrimple〜使用するのに適した場所は、path.joinここにあなたの他の回答になりますstackoverflow.com/questions/9027648/...。その答えは、私がここであなたが答えた別の質問に私を導きました:)
Pebbl

23
5分後にコードが爆発するまで、私はその答えについても懐疑的でしたreturn baseDir + relativePath + filename;。すぐにに交換しましたreturn path.join(baseDir, relativePath, filename);。本当に助かります!
ペドロ

34

短い答え:

すべてのfs.*関数(例:fs.openなど)はパス名を扱います。したがって、path.join自分自身を使用してコードを判読不能にする必要はありません。

長い答え:

すべてのfs.*関数がを呼び出しpath._makeLong(path)、次にが呼び出されますpath.resolve(path)。これには特別なRegExps for Windowsがあり、バックスラッシュ\またはスラッシュが考慮されます/。あなたは彼らのソースコードを見てあなた自身のためにそれをチェックアウトすることができます:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.