Avez-vous besoin d'utiliser path.join dans node.js?

135

comme tout le monde sait que Windows fait des chemins avec des barres obliques inverses où Unix fait des chemins avec des barres obliques. node.js fournit path.join()de toujours utiliser la barre oblique correcte. Ainsi, par exemple, au lieu d'écrire uniquement Unix, 'a/b/c'vous le feriez à la path.join('a','b','c')place.

Cependant, il semble que malgré cette différence, si vous ne normalisez pas vos chemins (par exemple en utilisant path.join) et écrivez simplement des chemins comme a/b/cnode.js, vous n'aurez aucun problème à exécuter vos scripts sous Windows.

Alors , est - il un avantage par rapport écrit path.join('a','b','c')sur 'a/b/c'? Les deux semblent fonctionner quelle que soit la plate-forme ...

balupton
la source

Réponses:

106

Les systèmes de fichiers Windows n'ont aucun problème à utiliser des barres obliques avant ou arrière comme séparateurs de chemin (c'est le cas depuis l'époque DOS). Le seul vrai problème est que les processeurs de ligne de commande Windows (ou, plus spécifiquement, les utilitaires de ligne de commande natifs de Windows) ont tendance à interpréter les barres obliques comme des spécificateurs d'options plutôt que des composants de chemin. Par conséquent, vous avez besoin d'un chemin avec une barre oblique inverse si vous devez passer un chemin vers une commande Windows exécutée en tant que sous-processus. De plus, les appels d'API Windows (et les méthodes des langages de niveau supérieur qui appellent l'API Windows) qui renvoient des chemins utiliseront des barres obliques inverses, donc même si vous ne les transmettez pas à des sous-processus, vous devrez les normaliser.

ebohlman
la source
Les barres obliques interrompent également les chemins UNC.
user2426679
Cette réponse ne précise pas pourquoi l'utiliser dans les applications Node.js. Ou peut-être que c'est juste moi qui ne comprend pas. Même si c'était intéressant.
Gherman
96

path.join prendra soin des délimiteurs inutiles, qui peuvent se produire si les chemins donnés proviennent de sources inconnues (par exemple, entrée utilisateur, API tierces, etc.).

Donc path.join('a/','b') path.join('a/','/b'), path.join('a','b')et path.join('a','/b')tous donneront a/b.

Sans l'utiliser, vous vous attendez généralement au début et à la fin des chemins joints, sachant qu'ils n'ont qu'une seule barre oblique.

dronus
la source
Cela semble un peu utile, mais recevoir des chemins arbitraires non vérifiés provenant de sources inconnues semble être un gros problème de sécurité. Ce n'est pas quelque chose à faire souvent.
Gherman
50

J'utilise path.joinpour m'assurer que les séparateurs de dossiers sont aux bons endroits, pas nécessairement pour m'assurer qu'il utilise des barres obliques avant et arrière. Par exemple:

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

Insérera correctement le séparateur entre www et test /var/www/test

Timothy Strimple
la source
2
Je ne comprends pas ce point. Si vous avez ces scripts dans des variables, pourquoi ne pas simplement ajouter une barre oblique manuellement?
mgol
2
J'ai également du mal à comprendre cette réponse. Je ne vois aucune valeur.
oligofren
23
Parce que je ne sais pas toujours si les valeurs de chemin que j'obtiens d'autres sources auront ou non des barres obliques. Mon exemple ci-dessus a été inventé. Souvent, ces chemins ne sont pas codés en dur, mais sont extraits d'autres fichiers de configuration, d'entrées utilisateur, de bibliothèques, etc.
Timothy Strimple
@TimothyStrimple ~ un bon endroit à utiliser path.joinserait dans votre autre réponse ici stackoverflow.com/questions/9027648/… . Cette réponse m'a conduit ici à une autre question à laquelle vous avez répondu :)
Pebbl
23
J'étais également sceptique sur cette réponse jusqu'à 5 minutes plus tard, mon code a explosé return baseDir + relativePath + filename;. Je l'ai tout de suite remplacé par return path.join(baseDir, relativePath, filename);. C'est en effet très utile!
Pedro
34

Réponse courte:

Toutes les fs.*fonctions (par exemple fs.open, etc.) traitent le chemin pour vous. Vous n'avez donc pas besoin de path.joinvous utiliser et de rendre votre code illisible.

Longue réponse:

Toutes les fs.*fonctions appellent path._makeLong(path), qui à leur tour appellent path.resolve(path), qui a des RegExps spéciales pour Windows, qui prend en compte les barres \obliques inverses ou les barres obliques /. Vous pouvez le vérifier par vous-même en regardant leur code source à:

Rafael Xavier
la source