Unterschied zwischen path.normalize und path.resolve in Node.js

86

Was ist der Unterschied (falls vorhanden) zwischen path.normalize(your_path)und path.resolve(your_path)?

Ich weiß path.resolve(...), dass mehrere Argumente akzeptiert werden können, aber ist das Verhalten mit einem einzelnen Argument dasselbe wie das Aufrufen path.normalize()?

BEARBEITEN: Wenn sie sich genauso verhalten sollen, verstehe ich den Zweck des Offenlegens der path.normalize(...)Funktion nicht, wenn Sie den Pfad einfach an übergeben können. path.resolve(...)Oder vielleicht zu Dokumentationszwecken. Zum Beispiel heißt es in der Dokumentation für path.resolve(...):

... Der resultierende Pfad wird normalisiert und ...

Das Belichten von path.normalize(...)macht es einfacher zu erklären, was "normalisiert" bedeutet ??? Ich weiß nicht.

BMiner
quelle

Antworten:

181

path.normalizewird der zusätzliche befreien ., ..etc. in den Weg. path.resolveLöst einen Pfad in einen absoluten Pfad auf. Beispiel (mein aktuelles Arbeitsverzeichnis war /Users/mtilley/src/testing):

> path.normalize('../../src/../src/node')
'../../src/node'
> path.resolve('../../src/../src/node')
'/Users/mtilley/src/node'

Mit anderen Worten: path.normalize"Was ist der kürzeste Weg, den ich nehmen kann, der mich an den gleichen Ort wie die Eingabe führt", während path.resolve"Was ist mein Ziel, wenn ich diesen Weg gehe".

Beachten Sie jedoch , dass path.normalize()ist viel als mehr kontextunabhängigen path.resolve(). Hat path.normalize()gewesen kontext- de pendent (dh , wenn es das aktuelle Arbeitsverzeichnis berücksichtigt hatte), das Ergebnis in dem obigen Beispiel wäre gewesen ist ../node, denn das ist der kürzeste Weg man ist könnte aus nehmen /Users/mtilley/src/testingzu /Users/mtilley/src/node.

Ironischerweise bedeutet dies, dass path.resolve()ein relativer Pfad in absoluten Begriffen erzeugt wird (Sie könnten ihn überall ausführen, und es würde das gleiche Ergebnis erzeugen), während path.normalize()ein absoluter Pfad in relativen Begriffen erzeugt wird (Sie müssen ihn in dem Pfad ausführen, relativ zu dem Sie möchten das absolute Ergebnis berechnen).

Michelle Tilley
quelle
Nett. Danke für die Antwort! Das nervt mich schon eine Weile. Die Node-Dokumente sind zwar normalerweise sehr nett, haben mich aber ein wenig verwirrt.
BMiner
14
Beachten Sie außerdem, dass path.normalize alle Pfade verarbeiten kann, die Sie möglicherweise normalisieren möchten, und nur die Zeichenfolgenmanipulation des Pfads bedeutet, während path.resolve das Dateisystem und das aktuelle Verzeichnis verwendet, um den Pfad in einen absoluten Pfad aufzulösen. Dadurch verhalten sie sich ganz anders, da path.normalize möglicherweise für einen Pfad in einer TAR-Datei, in einem Remote-Dateisystem oder für etwas völlig Abstraktes verwendet wird.
Nakedible
Wie unterscheiden sie sich von path.join?
Vijey
2

Aus den Dokumenten:

Eine andere Möglichkeit, sich Auflösung vorzustellen, ist eine Folge von CD-Befehlen in einer Shell.

Links zu path.resolve und path.normalize in der Dokumentation. Ich möchte meistens nicht nur Links in einer Antwort angeben, sondern die Node.js-Dokumente sind sehr anständig.

Pickels
quelle
Ich glaube, ich verstehe den Zweck der Freigabe der Normalisierungsfunktion (...) nicht, wenn Sie den Pfad einfach an path.resolve (...) übergeben können
BMiner
6
Der Pfad, den Sie normalisieren, ist möglicherweise nicht im Dateisystem vorhanden, z. B. normalisieren Sie möglicherweise einen Pfad zu einer Datei, die Sie erstellen möchten, oder Sie normalisieren möglicherweise relative URL-Pfade.
Lanzz
Eigentlich weiß ich auch nicht, warum Sie Normalisieren statt Auflösen verwenden würden.
Pickels
1
Normalisieren vervollständigt den Pfad zu einem absoluten Pfad nicht. So kann es verwendet werden, um einen vernünftigen Pfad für einige Ressourcen relativ zu einer anderen Ressource zu erhalten, der in HTML verwendet werden kann, um beispielsweise auf eine vom Benutzer ausgewählte Datei zu verweisen. Da der normalisierte Pfad immer einfach ist (kein Extra ../), kann er leicht überprüft werden, um sicherzustellen, dass der Benutzer nur Dateien von bestimmten Speicherorten auswählt und keine Chance hat, private Dateien außerhalb dieser Speicherorte anzuzeigen.
Dronus