Was ist ein „kanonischer Weg“?

78

Ein absoluter Pfad ist also ein Weg, um zu einer bestimmten Datei oder einem bestimmten Speicherort zu gelangen, der bzw. der den vollständigen Weg dorthin, den vollständigen Pfad und das Betriebssystem beschreibt (die absoluten Pfade für Windows und Linux sind beispielsweise unterschiedlich). Ein relativer Pfad ist ein Route zu einer Datei oder einem Speicherort, die bzw. der vom aktuellen Speicherort aus beschrieben wird. (zwei Punkte) zeigt eine übergeordnete Ebene im Verzeichnisbaum an. Das ist mir seit einigen Jahren klar.

Bei der Suche habe ich sogar gesehen, dass es auch kanonisierte Dateien gibt! Alles was ich weiß ist CANONICAL bedeutet so etwas wie "nach den Regeln" oder so.

Kann mich jemand in theoretischen Fragen über kanonische Dinge aufklären?

Metafaniel
quelle
5
Mit "SO" meinen Sie "OS"? Bist du Französisch?
Kerrek SB
"Système d'exploitation" Ja, ich kenne Französisch, aber ich meinte Betriebssystem (ich schreibe es falsch, sorry hehe) Betriebssystem ... Ich bin in der Tat Mexikaner xD
Metafaniel
4
Ahh, "Sistema de la operación, ¡olé!" (Und es ist übrigens "Betriebssystem".)
Kerrek SB
4
Emmm ... xD Eigentlich sollte es "Sistema Operativo" sein und Olé ist ziemlich spanisch (Spanien) und ja, ich weiß, dass es
funktioniert
@Editor, während ich stimme es gibt kein wirkliches Wort „kanonisierte“, dann ist es auch fehlerhaft , dass der Devs tun , zu glauben , nicht verbinate ( „EnVerb“) Worte aller Zeit. Für Suchzwecke hätte wahrscheinlich beides funktioniert.
Dave Newton

Antworten:

90

Der springende Punkt, etwas "kanonisch" zu machen, ist, dass Sie zwei Dinge vergleichen können. Beispielsweise beziehen sich beide ../../here/bar/xund ./test/../../bar/xmöglicherweise auf denselben Speicherort, Sie können jedoch keinen Textvergleich für die beiden Pfade durchführen. Wenn Sie sie jedoch in ihre kanonische Darstellung verwandeln, werden sie beide ../bar/x, und wir sehen, dass sie sich tatsächlich auf dasselbe beziehen.

Kurz gesagt, es gibt oft viele Möglichkeiten, sich auf eine Sache zu beziehen, und in diesem Fall können Sie möglicherweise eine kanonische Darstellung definieren, die einzigartig ist und die es Ihnen ermöglicht, Sammlungen solcher Dinge in den Griff zu bekommen.

(Wenn Sie nach weiteren Beispielen suchen, ist die gesamte Mathematik voll von "kanonischen" Konstruktionen für alle Arten von Objekten und sehr zum gleichen Zweck. Vielleicht kann dieser Wikipedia-Artikel einige zusätzliche Anweisungen geben.)

Kerrek SB
quelle
1
Oooh, ich verstehe jetzt ... Kurz gesagt, das Kanonische muss eindeutig sein, also ist es der sehr vollständige Pfad ohne relative Verwendung der beiden Punkte. Oh! Ihre Antwort war hilfreich;) Danke
Metafaniel
@ Metafaniel: Ja, der entscheidende Teil ist die Einzigartigkeit. Ich denke, Sie können sowohl einen kanonischen Verwandten als auch einen kanonischen absoluten Pfad haben, aber das ist eine unabhängige Unterscheidung.
Kerrek SB
1
Bis zu diesem Kommentar war alles gut und richtig. XD OK, ich habe verstanden, aber ... ein kanonischer relativer Pfad? Wie ich bis jetzt verstanden habe (danke an alle), sind die kanonischen Pfade von Natur aus absolut. Was können Sie mir über die kanonischen relativen Pfade sagen? = S DANKE =)
Metafaniel
1
@Metafaniel: Ein kanonischer relativer Pfad wäre relativ zu einem bestimmten festen Arbeitsverzeichnis. In Bezug auf das angegebene Verzeichnis können Sie eindeutige relative Pfade bilden. Sie können diese jedoch nur für dasselbe Arbeitsverzeichnis vergleichen. Im Gegensatz dazu können kanonische absolute Pfade global verglichen werden.
Kerrek SB
1
Dies funktioniert nicht, wenn Sie Hard- oder Softlinks für Verzeichnisse oder Dateien autorisieren. In diesem Fall ist das Definieren eines kanonischen Pfads viel schwieriger (siehe Antwort @alfasin).
Jean-Baptiste Yunès
27

Ein guter Weg, um einen kanonischen Pfad zu definieren, ist: the shortest absolute path(kurz, im Sinne der Zeichenfolgenlänge).

Dies ist ein Beispiel für den Unterschied zwischen einem absoluten Pfad und einem kanonischen Pfad:

absoluter Pfad: C:\abc\..\abc\file.txt
kanonischer Pfad:C:\abc\file.txt

Nir Alfasi
quelle
1
Laut @KerrekSB muss der Pfad eindeutig sein, um kanonisch zu sein. In Ihrem Beispiel kann ich ihn also sehen: Es gibt keine andere Möglichkeit, C: \ abc \ file.txt
darzustellen.
2
@alfasin: Microsoft scheint Ihrer Behauptung nicht zuzustimmen, dass "es in Windows keinen kanonischen Pfad gibt", wie die Windows-API-Funktion PathCanonicalize belegt . Zwar erzwingt Windows im Allgemeinen keine Groß- und Kleinschreibung in Pfaden (obwohl dies von der Lautstärke abhängt), doch behält Windows die Groß- und Kleinschreibung jedes Zeichens in einem Pfad bei, selbst wenn der Zugriff ohne Berücksichtigung der Groß- und Kleinschreibung zulässig ist. Mein Punkt ist jedenfalls immer noch, dass der kürzestmögliche absolute Weg nicht unbedingt kanonisch ist.
Dan Korn
2
@ DanKorn sagen ihnen, sie sollen mit der Definition von kanonisch streiten . Was Ihre Meinungsverschiedenheit betrifft, haben Sie vielleicht Recht, aber ich habe immer noch kein gutes Gegenbeispiel gesehen ;)
Nir Alfasi
2
@alfasin: Abgesehen von den Wörterbuchdefinitionen scheint Microsoft mir zu definieren, was ihre eigenen Begriffe in ihrem eigenen Betriebssystem und ihren eigenen APIs bedeuten. Wer hat eine höhere Autorität darüber, was in Windows kanonisch ist als sie? Und warum ist "C: \ PROGRA ~ 1" kein gutes Gegenbeispiel zu Ihrer Behauptung, dass der kürzeste Weg per Definition kanonisch ist?
Dan Korn
3
@DanKorn mit allem Respekt für Microsoft (und ich tun sie respektieren) sie bekommen nicht zu definieren , was die Bedeutung des kanonischen ist. Kanonisch bedeutet "einzigartig" oder "einzigartige Darstellung". Da das Windows-Betriebssystem nicht zwischen Groß- und Kleinschreibung unterscheidet, kann es per Definition keine eindeutige Darstellung eines Pfads geben. Es kann absolut, aber nicht kanonisch sein. Wenn diese Argumentation für Sie nicht vernünftig erscheint, können Sie nicht zustimmen, aber da diese Diskussion zwecklos wird (ich wiederhole und erkläre meine Worte), lassen Sie es uns hier abschneiden und zustimmen, nicht zuzustimmen.
Nir Alfasi
6

Was ein kanonischer Pfad ist (oder sein Unterschied zu einem absoluten Pfad), ist systemabhängig.
Wenn ein (vollständiger) Pfad Aliase, Verknüpfungen oder symbolische Links enthält, löst der kanonische Pfad all diese normalerweise in die tatsächlichen Verzeichnisse auf, auf die sie verweisen.
Beispiel: Wenn /bin/aes sich um einen Sym-Link handelt, können Sie ihn überall dort finden, wo Sie einen absoluten Pfad anfordern, z. B. in java.io.File # getAbsolutePath, während die reale Datei (dh das eigentliche Ziel des Links) usr/local/bin/aals kanonischer Pfad zurückgegeben wird, z von java.io.File # getCanonicalPath

Cratylus
quelle
Sehr nützlich, damit ich Ihren Kommentar auch verstehe! Ich habe noch nicht einmal an Sym-Links gedacht! Ein Sym-Link ist also absolut, ABER nicht kanonisch ... Sehr umfassend. JEDOCH habe ich einen neuen Zweifel ... Was ist mit harten Links? Sind sie nicht absolut genug? DANKE
Metafaniel
Depends.Zum Beispiel java.io.File # getCanonicalPath löst keine harten Links auf
Cratylus
1
Ich habe nicht so viel in Java entwickelt, ich bin hauptsächlich ein PHP-Typ;) Danke für die Klarstellung =)
Metafaniel
Re. harte Verbindungen: Es gibt kein Konzept wie das Auflösen einer harten Verbindung zu einer kanonischen Form. Wenn zwei Dateien fest miteinander verknüpft sind, verweisen beide auf dieselben Daten auf der Festplatte, sodass keine kanonische Form mehr vorhanden ist, sondern nur zwei identische Dateien, deren Daten tatsächlich denselben Speicherplatz auf der Festplatte belegen. Welche der Dateien zuerst mit den Daten auf der Festplatte verknüpft wurde, ist für das Konzept der kanonischen Benennung nicht relevant. Siehe stackoverflow.com/questions/185899/…
Connie Dobbs
2

Die meisten Probleme mit kanonischen Pfaden treten auf, wenn Sie den Namen eines Verzeichnisses und nicht einer Datei übergeben. Wenn wir für die Datei einen absoluten Pfad angeben, ist dies auch der kanonische Pfad. Aber für dir bedeutet es, das letzte "/" wegzulassen. Zum Beispiel ist "/ var / tmp / foo" ein kanonischer Pfad, "/ var / tmp / foo /" nicht.

Achintya Guchhait
quelle