Você precisa usar o path.join no node.js?


134

como todos sabem, o Windows faz caminhos com barras invertidas, enquanto o Unix faz caminhos com barras invertidas. O node.js fornece path.join()sempre o uso da barra correta. Então, por exemplo, em vez de escrever apenas o Unix, 'a/b/c'você o faria path.join('a','b','c').

No entanto, parece que, apesar dessa diferença, se você não normalizar seus caminhos (por exemplo, usando path.join) e apenas escrever caminhos como a/b/cnode.js, não haverá problemas em executar seus scripts no Windows.

Então, existe algum benefício em escrever path.join('a','b','c')sobre 'a/b/c'? Ambos parecem funcionar independentemente da plataforma ...

Respostas:


106

Os sistemas de arquivos do Windows não têm problemas ao usar barras invertidas ou para trás como separadores de caminho (esse é o caso desde os dias do DOS). O único problema real é que os processadores de linha de comando do Windows (ou, mais especificamente, os utilitários de linha de comando nativos do Windows) tendem a interpretar barras como especificadores de opções em vez de componentes de caminho. Portanto, você precisa de um caminho com barra invertida se precisar passar um caminho para um comando do Windows executado como um subprocesso. Além disso, as chamadas da API do Windows (e métodos de linguagens de nível superior que chamam a API do Windows) que retornam caminhos usarão barras invertidas; portanto, mesmo se você não as estiver passando para subprocessos, será necessário normalizá-las.


As barras também quebram os caminhos UNC.
user2426679

Esta resposta não esclarece por que usá-lo em aplicativos típicos do Node.js. Ou talvez seja apenas eu que não entendo. Embora tenha sido interessante.
Gherman

96

path.join cuidará de delimitadores desnecessários, que podem ocorrer se os caminhos fornecidos vierem de fontes desconhecidas (por exemplo, entrada do usuário, APIs de terceiros etc.).

Então path.join('a/','b') path.join('a/','/b'), path.join('a','b')e path.join('a','/b')todos vão dar a/b.

Sem usá-lo, você normalmente faria expectativas sobre o início e o fim dos patches unidos, sabendo que eles não têm apenas uma barra.


Parece um pouco útil, mas receber caminhos arbitrários e não verificados de fontes desconhecidas parece um grande problema de segurança. Isso não é algo para fazer com frequência.
Gherman

50

Eu uso path.joinpara garantir que os separadores de pastas estejam nos lugares corretos, não necessariamente para garantir que ele use barras versus barras invertidas. Por exemplo:

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

Inserirá corretamente o separador entre www e teste /var/www/test


2
Eu não entendo esse ponto. Se você possui esses scripts em variáveis, por que não adicionar uma barra manualmente?
mgol

2
Eu também tenho problemas para entender esta resposta. Não é possível ver nenhum valor.
21414 oligofren

23
Porque nem sempre tenho certeza se os valores de caminho que recebo de outras fontes terão barras finais ou não. Meu exemplo acima foi inventado. Muitas vezes esses caminhos não está codificado, mas estão a ser puxado a partir de outros ficheiros de configuração, a entrada do utilizador, bibliotecas, etc.
Timothy Strimple

@ TimothyStrimple ~ Um bom lugar para usar path.joinseria em sua outra resposta aqui stackoverflow.com/questions/9027648/… . Essa resposta me trouxe até aqui a outra pergunta respondida por si mesmo :)
Pebbl

23
Eu também estava cético em relação a essa resposta até 5 minutos depois, meu código explodiu return baseDir + relativePath + filename;. Substituí-lo imediatamente por return path.join(baseDir, relativePath, filename);. É realmente muito útil!
Pedro

34

Resposta curta:

Todas as fs.*funções (por exemplo fs.open, etc) tratam o nome do caminho para você. Portanto, você não precisa se usar path.joine tornar seu código ilegível.

Resposta longa:

Todas as fs.*funções chamam path._makeLong(path), que por sua vez chamam path.resolve(path), que tem RegExps especial para Windows, que leva em conta barras invertidas \ou barras invertidas /. Você pode conferir por si mesmo, procurando o código-fonte em:

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.