Devi usare path.join in node.js?


134

come tutti sanno, Windows fa percorsi con barre rovesciate in cui Unix fa percorsi con barre. node.js prevede path.join()di utilizzare sempre la barra corretta. Quindi, ad esempio, invece di scrivere Unix, 'a/b/c'faresti solo tu path.join('a','b','c').

Tuttavia, sembra che, nonostante questa differenza, se non si normalizzano i percorsi (ad es. Utilizzando path.join) e si scrivono solo percorsi come a/b/cnode.js non ha problemi con l'esecuzione degli script su Windows.

Quindi non v'è alcun beneficio oltre a scrivere path.join('a','b','c')sopra 'a/b/c'? Entrambi sembrano funzionare indipendentemente dalla piattaforma ...

Risposte:


106

I filesystem di Windows non hanno problemi ad usare le barre in avanti o all'indietro come separatori di percorso (questo è stato il caso sin dai tempi di DOS). L'unico vero problema è che i processori della riga di comando di Windows (o, più specificamente, le utility della riga di comando native di Windows) tendono a interpretare le barre in avanti come identificatori di opzioni piuttosto che componenti del percorso. Pertanto, è necessario un percorso rovesciato se è necessario passare un percorso a un comando di Windows eseguito come sottoprocesso. Inoltre, le chiamate dell'API di Windows (e i metodi da linguaggi di livello superiore che chiamano l'API di Windows) che restituiscono i percorsi utilizzeranno barre rovesciate, quindi anche se non le stai passando a sottoprocessi, dovrai normalizzarle.


Le barre in avanti interrompono anche i percorsi UNC.
user2426679

Questa risposta non chiarisce perché usarla nelle tipiche app Node.js. O forse sono solo io a non capirlo. Anche se è stato interessante.
Gherman

96

path.join si occuperà dei delimitatori inutili, che possono verificarsi se i percorsi indicati provengono da fonti sconosciute (ad es. input dell'utente, API di terze parti ecc.).

Quindi path.join('a/','b') path.join('a/','/b'), path.join('a','b')e path.join('a','/b')tutti daranno a/b.

Senza usarlo, di solito ci si aspetterebbe dell'inizio e della fine dei percorsi uniti, sapendo che non hanno una barra o una barra.


Sembra un po 'utile, ma ricevere percorsi arbitrari non controllati da fonti sconosciute sembra un grosso problema di sicurezza. Non è qualcosa da fare spesso.
Gherman

50

Uso path.joinper garantire che i separatori di cartelle si trovino nei posti corretti, non necessariamente per garantire che utilizzi le barre in avanti e indietro. Per esempio:

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

Inserirà correttamente il separatore tra www e test /var/www/test


2
Non capisco questo punto. Se hai questi script nelle variabili, perché non aggiungere semplicemente una barra?
mgol

2
Ho anche problemi a capire questa risposta. Non riesco a vedere alcun valore.
Oligofren,

23
Perché non sono sempre sicuro se i valori del percorso che ottengo da altre fonti avranno barre finali o meno. Il mio esempio sopra è stato inventato. Spesso quei percorsi non sono codificati, ma vengono estratti da altri file di configurazione, input dell'utente, librerie, ecc.
Timothy Strimple,

@TimothyStrimple ~ un buon posto da usare path.joinsarebbe nella tua altra risposta qui stackoverflow.com/questions/9027648/… . Questa risposta mi ha portato qui a un'altra domanda a cui hai risposto :)
Pebbl

23
Ero anche scettico su quella risposta fino a quando 5 minuti dopo il mio codice è esploso return baseDir + relativePath + filename;. L'ho sostituito subito da return path.join(baseDir, relativePath, filename);. È davvero molto utile!
Pedro,

34

Risposta breve:

Tutte le fs.*funzioni (ad es. fs.open, Ecc.) Trattano il percorso per te. Pertanto, non è necessario utilizzare path.jointe stesso e rendere il codice illeggibile.

Risposta lunga:

Tutte le fs.*funzioni chiamano path._makeLong(path), che a loro volta chiamano path.resolve(path), che ha RegExps speciale per Windows, che tiene conto di barre rovesciate \o in avanti /. Puoi provarlo tu stesso guardando il loro codice sorgente su:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.