¿Necesita usar path.join en node.js?

134

como todos saben, Windows hace rutas con barras invertidas, donde Unix hace rutas con barras diagonales. node.js proporciona path.join()usar siempre la barra diagonal correcta. Entonces, por ejemplo, en lugar de escribir Unix, solo 'a/b/c'lo haría usted en su path.join('a','b','c')lugar.

Sin embargo, parece que, a pesar de esta diferencia, si no normaliza sus rutas (por ejemplo, usando path.join) y simplemente escribe rutas como a/b/cnode.js, no tiene problemas para ejecutar sus scripts en Windows.

Entonces, ¿hay algún beneficio sobre escribir path.join('a','b','c')sobre 'a/b/c'? Ambos parecen funcionar independientemente de la plataforma ...

Balupton
fuente

Respuestas:

106

Los sistemas de archivos de Windows no tienen problemas para usar barras diagonales hacia adelante o hacia atrás como separadores de ruta (este ha sido el caso desde los días de DOS). El único problema real es que los procesadores de línea de comandos de Windows (o, más específicamente, las utilidades de línea de comandos nativas de Windows) tienden a interpretar barras diagonales como especificadores de opciones en lugar de componentes de ruta. Por lo tanto, necesita una ruta reducida si necesita pasar una ruta a un comando de Windows que se ejecuta como un subproceso. Además, las llamadas a la API de Windows (y los métodos de lenguajes de nivel superior que llaman a la API de Windows) que devuelven rutas usarán barras diagonales inversas, por lo que incluso si no las pasa a subprocesos, deberá normalizarlas.

ebohlman
fuente
Las barras diagonales también rompen los caminos UNC.
user2426679
Esta respuesta no aclara por qué usarla en las aplicaciones típicas de Node.js. O tal vez solo soy yo no lo entiendo. Aunque fue interesante.
Gherman
96

path.join se encargará de delimitadores innecesarios, que pueden ocurrir si los parches provienen de fuentes desconocidas (por ejemplo, entrada del usuario, API de terceros, etc.).

Entonces path.join('a/','b') path.join('a/','/b'), path.join('a','b')y path.join('a','/b')todos darán a/b.

Sin usarlo, generalmente haría expectativas sobre el inicio y el final de las combinaciones unidas, sabiendo que solo tienen una barra o ninguna.

Dronus
fuente
Eso suena un poco útil, pero recibir rutas arbitrarias no controladas de fuentes desconocidas parece un gran problema de seguridad. Eso no es algo que hacer a menudo.
Gherman
50

Lo uso path.joinpara asegurar que los separadores de carpetas estén en los lugares correctos, no necesariamente para asegurar que use barras inclinadas hacia adelante y hacia atrás. Por ejemplo:

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

Insertará correctamente el separador entre www y prueba /var/www/test

Timothy Strimple
fuente
2
No entiendo este punto. Si tiene esos scripts en variables, ¿por qué no solo agrega una barra manualmente?
mgol
2
También tengo problemas para entender esta respuesta. No se puede ver ningún valor.
oligofren
23
Porque no siempre estoy seguro de si los valores de ruta que obtengo de otras fuentes tendrán barras diagonales finales o no. Mi ejemplo anterior fue inventado. A menudo esos caminos no están codificados, pero están siendo sacados de otros archivos de configuración, la entrada del usuario, bibliotecas, etc.
Timoteo Strimple
@TimothyStrimple ~ un buen lugar para usar path.joinsería en su otra respuesta aquí stackoverflow.com/questions/9027648/… . Esa respuesta me llevó aquí a otra pregunta respondida por ti mismo :)
Pebbl
23
También era escéptico sobre esa respuesta hasta que 5 minutos después mi código explotó return baseDir + relativePath + filename;. Lo reemplacé de inmediato return path.join(baseDir, relativePath, filename);. De hecho, es muy útil!
Pedro
34

Respuesta corta:

Todas las fs.*funciones (p. Ej. fs.open, Etc.) tratan el nombre de ruta por usted. Por lo tanto, no necesita usar path.joinusted mismo y hacer que su código sea ilegible.

Respuesta larga:

Todas las fs.*funciones llaman path._makeLong(path), que a su vez llaman path.resolve(path), que tiene RegExps especiales para Windows, que tiene en cuenta la barra invertida \o la barra diagonal /. Puede verificarlo usted mismo mirando su código fuente en:

Rafael Xavier
fuente