Müssen Sie path.join in node.js verwenden?

134

Wie jeder weiß, erstellt Windows Pfade mit umgekehrten Schrägstrichen, während Unix Pfade mit Schrägstrichen erstellt. node.js sieht vor path.join(), immer den richtigen Schrägstrich zu verwenden. Anstatt beispielsweise nur Unix zu schreiben 'a/b/c', würden Sie dies path.join('a','b','c')stattdessen tun .

Es scheint jedoch, dass trotz dieses Unterschieds a/b/ckein Problem mit der Ausführung Ihrer Skripte unter Windows besteht, wenn Sie Ihre Pfade nicht normalisieren (z. B. mit path.join) und nur Pfade wie node.js schreiben .

So gibt es einen Vorteil gegenüber schriftlich path.join('a','b','c')über 'a/b/c'? Beide scheinen unabhängig von der Plattform zu funktionieren ...

Balupton
quelle

Antworten:

106

Windows-Dateisysteme haben kein Problem damit, Schrägstriche vorwärts oder rückwärts als Pfadtrennzeichen zu verwenden (dies war seit den DOS-Tagen der Fall). Das einzige wirkliche Problem besteht darin, dass Windows-Befehlszeilenprozessoren (oder insbesondere Windows-native Befehlszeilenprogramme) Schrägstriche eher als Optionsspezifizierer als als Pfadkomponenten interpretieren. Daher benötigen Sie einen umgekehrten Pfad, wenn Sie einen Pfad an einen Windows-Befehl übergeben müssen, der als Unterprozess ausgeführt wird. Außerdem verwenden Windows-API-Aufrufe (und Methoden aus höheren Sprachen, die die Windows-API aufrufen), die Pfade zurückgeben, Backslashes. Selbst wenn Sie sie nicht an Unterprozesse übergeben, müssen Sie sie normalisieren.

ebohlman
quelle
Schrägstriche unterbrechen auch UNC-Pfade.
user2426679
Diese Antwort macht nicht klar, warum sie in typischen Node.js-Apps verwendet wird. Oder vielleicht verstehe ich es einfach nicht. Obwohl es interessant war.
Gherman
95

path.join kümmert sich um unnötige Trennzeichen, die auftreten können, wenn die angegebenen Pfade aus unbekannten Quellen stammen (z. B. Benutzereingaben, APIs von Drittanbietern usw.).

So path.join('a/','b') path.join('a/','/b'), path.join('a','b')und path.join('a','/b')werden alle geben a/b.

Ohne es zu verwenden, würden Sie normalerweise Erwartungen über den Beginn und das Ende der verbundenen Pfade stellen, da Sie wissen, dass sie nur keinen oder nur einen Schrägstrich haben.

Dronus
quelle
Das klingt ein bisschen nützlich, aber das Empfangen beliebiger ungeprüfter Pfade von unbekannten Quellen klingt nach einem großen Sicherheitsproblem. Das ist nicht oft zu tun.
Gherman
50

Ich verwende, path.joinum sicherzustellen, dass sich Ordnertrennzeichen an den richtigen Stellen befinden, nicht unbedingt, um sicherzustellen, dass Schrägstriche vorwärts oder rückwärts verwendet werden. Beispielsweise:

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

Fügt das Trennzeichen zwischen www und test korrekt ein /var/www/test

Timothy Strimple
quelle
2
Ich verstehe diesen Punkt nicht. Wenn Sie diese Skripte in Variablen haben, fügen Sie einfach einen Schrägstrich manuell hinzu.
mgol
2
Ich habe auch Probleme, diese Antwort zu verstehen. Kann keinen Wert sehen.
Oligofren
23
Weil ich nicht immer sicher bin, ob die Pfadwerte, die ich von anderen Quellen erhalte, nachgestellte Schrägstriche haben oder nicht. Mein Beispiel oben wurde erfunden. Oft sind diese Pfade nicht fest codiert, sondern werden aus anderen Konfigurationsdateien, Benutzereingaben, Bibliotheken usw.
abgerufen
@TimothyStrimple ~ Ein guter Ort, um zu verwenden, path.joinwäre in Ihrer anderen Antwort hier stackoverflow.com/questions/9027648/… . Diese Antwort führte mich hierher zu einer anderen Frage, die Sie selbst beantwortet haben :)
Pebbl
23
Ich war auch skeptisch gegenüber dieser Antwort, bis 5 Minuten später mein Code explodierte return baseDir + relativePath + filename;. Ich habe es sofort durch ersetzt return path.join(baseDir, relativePath, filename);. Es ist in der Tat sehr hilfreich!
Pedro
34

Kurze Antwort:

Alle fs.*Funktionen (z. B. fs.openusw.) behandeln den Pfadnamen für Sie. Sie müssen sich also nicht path.joinselbst verwenden und Ihren Code unleserlich machen.

Lange Antwort:

Alle fs.*Funktionen rufen auf path._makeLong(path), was wiederum path.resolve(path)aufruft und über spezielle RegExps für Windows verfügt, die Schrägstriche \oder Schrägstriche berücksichtigen /. Sie können es selbst überprüfen und sich den Quellcode ansehen unter:

Rafael Xavier
quelle