web-dev-qa-db-ja.com

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

誰もが知っているように、Windowsはバックスラッシュを使用してパスを実行しますが、UNIXはスラッシュを使用してパスを実行します。 node.jsは、常に正しいスラッシュを使用するために path.join() を提供します。たとえば、Unixのみ'a/b/c'を記述する代わりに、代わりにpath.join('a','b','c')を実行します。

ただし、パスを正規化せず(たとえば、path.joinを使用)、a/b/c node.jsのようなパスを記述するだけでは、Windowsでスクリプトを実行しても問題はないようです。

'a/b/c'よりもpath.join('a','b','c')を書くよりも利点はありますか?どちらもプラットフォームに関係なく機能するようです...

126
balupton

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

98
ebohlman

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

したがって、path.join('a/','b')path.join('a/','/b')path.join('a','b')、およびpath.join('a','/b')はすべてa/bを返します。

使用しない場合、通常は、パスがスラッシュを1つも持たないか、1つしか持たないことがわかっているため、参加するパスの開始と終了について期待します。

87
dronus

path.joinを使用して、フォルダーセパレーターが正しい場所にあることを確認します。必ずしも、スラッシュとバックスラッシュのどちらを使用するかを確認するわけではありません。例えば:

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

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

45

簡潔な答え:

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

長い答え:

すべてのfs.*関数はpath._makeLong(path)を呼び出し、次にpath.resolve(path)を呼び出します。この関数は、バックスラッシュ\またはスラッシュ/を考慮した特別なRegExps for Windowsを持っています。ソースコードを見て、自分でチェックアウトできます:

31
Rafael Xavier