In einem Beispiel:
var assets = "images/"
var sounds = assets+"sounds/"
Ist es üblicher, den Schrägstrich auf die Rückseite eines Dateipfads zu setzen?
var assets = "/images"
var sounds = assets+"/sounds"
Gibt es eine andere Methode, die allgemein gebräuchlich ist?
conventions
file-structure
leuchtend
quelle
quelle
File.separator
. Die APIsFile
undPath
akzeptieren sowohl/
als auch "\".Antworten:
Nahezu jede wichtige Programmiersprache verfügt über eine Bibliothek, die die Verzeichnisseparatoren für Sie verwaltet. Sie sollten sie nutzen. Dies vereinfacht Ihren Code und beugt Fehlern vor .
Nach meiner Erfahrung ist der übliche Grund für das Kombinieren solcher Zeichenfolgen, dass sie aus verschiedenen Quellen stammen. Manchmal sind es andere Teile aus einer Konfigurationsdatei. Manchmal ist es eine Konstante, die mit einem Funktionsargument kombiniert wird. In jedem Fall müssen Sie, wenn sie aus verschiedenen Quellen stammen, verschiedene mögliche Fälle in Bezug auf die zu kombinierenden Trennzeichen an den Enden berücksichtigen:
"images/"
und"/sounds"
"images"
und"/sounds"
oder"images/"
und"sounds"
"images"
und"sounds"
Die Tatsache, dass jeder Teil aus einer anderen Quelle stammt, bedeutet, dass jede Quelle ihre eigenen Vorstellungen darüber hat, welche Konventionen zu befolgen sind, wenn sich jemand Gedanken darüber macht! Was auch immer Ihren Code aufruft, sollte sich darüber keine Sorgen machen müssen . Ihr Code sollte alle Fälle behandeln, da jemand gegen Ihre Konvention verstößt . Dies führt zu Zeitverschwendung bei der Untersuchung der Fehlerursache und der Behebung. Ich hatte einige unangenehme Fälle, in denen ein Mitarbeiter eine Annahme darüber machte, wie Pfade in einer Konfigurationsdatei formatiert werden sollten, was bedeutete, dass ich nach dem Code suchen und herausfinden musste, was sie erwarteten (oder den Code reparieren).
Die meisten Hauptsprachen bieten eine Methode, um dies für Sie zu tun, die bereits viele der Fälle behandelt:
os.path.join
für PythonFile.join
für RubyPath.join
für Node.jsPaths.get
für Java (7 und höher)Path.Combine
für .NETEs gibt eine Einschränkung bei diesen. Einige davon scheinen davon auszugehen, dass ein führendes Verzeichnis-Trennzeichen im zweiten Argument auf einen Stammpfad verweist und dass das erste Argument daher vollständig entfernt werden sollte. Ich weiß nicht, warum dies als nützlich erachtet wird. für mich verursacht es nur probleme. Ich wollte nie zwei Pfadabschnitte kombinieren und am Ende den ersten Teil fallen lassen. Lesen Sie die Dokumentation für spezielle Fälle sorgfältig durch und schreiben Sie, falls erforderlich, einen Wrapper, der genau das tut, was Sie wollen, anstatt dessen spezielle Behandlung.
Dies hilft zusätzlich, wenn Sie verschiedene Betriebssysteme unterstützen müssen. Diese Klassen sind fast überall für die Auswahl des richtigen Trennzeichens verantwortlich. Die Bibliotheken haben normalerweise eine Möglichkeit, Pfade zu normalisieren, um sie an die Konventionen des Betriebssystems anzupassen.
Für den Fall, dass Ihre Programmiersprache nicht über eine sofort verfügbare Bibliothek verfügt, sollten Sie eine Methode schreiben, die alle diese Fälle behandelt und diese großzügig und projektübergreifend verwendet.
Dies fällt in die Kategorie "Machen Sie keine Annahmen" und "Verwenden Sie Tools, die Ihnen helfen".
quelle
C:\Documents and Settings\Admin
mitmy folder:document.txt
einem * nix-System kombiniert werden konnte/home/admin/my folder/document.txt
- ein netter Trick, aber in der realen Welt haben die beteiligten Heuristiken mehr Fehler verursacht, als sie behoben haben.Paths.get()
Konvertiert für Java auch nur ein einzelnes ObjektString
in einPath
Objekt. Um Pfade zu verbinden, verwenden SiePath.resolve()
, die ein anderesPath
oder ein anderes aufnehmen könnenString
. Es gibt andere Methoden in derPath
Klasse, mit denen Pfade auf verschiedene Arten verbunden werden können.Paths
.[System.IO.Path]::Combine("abc", "\def")
die das beschriebene Verhalten hat, ist die Cmdlets ,Join-Path "abc" "\def"
die gibt"abc\def"
.In Java wäre die Antwort "keines der oben genannten". Es wird empfohlen, Pfadnamen mithilfe der
java.io.File
Klasse zusammenzustellen. z.BDie
File
Klasse kümmert sich auch um plattformspezifische Pfadnamentrennzeichen.Es gibt eine separate Frage, ob Ihr Pfadname mit einem Schrägstrich beginnen soll oder nicht. Das hat aber mehr mit Korrektheit als mit Best Practice zu tun. Ein Pfadname, der mit einem Schrägstrich beginnt, bedeutet etwas anderes als ein Pfadname, der nicht mit einem Schrägstrich beginnt.
Es gibt keine explizite Unterstützung für die Behandlung von Pfadnamen in der ECMA-Javascript-Bibliothek, aber (zumindest) Node.js bietet Unterstützung über das Path-Modul.
quelle
os.path.join
. PowerShell hatjoin-path
. Ich würde dieser Antwort etwas hinzufügen. Ich habe festgestellt, dass, wenn Sie Dateipfade in mehreren Teilen benötigen, Ihr Code sehr zerbrechlich wird, wenn Sie Annahmen über Dateipfade an bestimmten Stellen treffen. Die Verwendung dieser Klassen trägt nicht nur zur Portabilität bei, sondern behandelt auch alle möglichen Kantenfälle (Schrägstrich an beiden zu verbindenden Enden, Schrägstrich nur auf einer Seite, überhaupt kein Schrägstrich dazwischen). Diese Flexibilität ist von unschätzbarem Wert, wenn Sie Dateipfade in einer Konfigurationsdatei ablegen.Beachten Sie, dass Sie in .NET die Path.Combine-Methode verwenden sollten.
Der Grund dafür ist, dass es die richtigen Zeichen "kennt" , die beim Erstellen der Ordnernamen verwendet werden.
Dies beseitigt das "Problem" der Vor- oder Nachfixierung.
quelle
os.path.join('src', '../../../your_secret_stuff')
ist in Python gültig. Verwenden Sie diese Methoden also nicht blind für Benutzereingaben.Beim Erstellen von Pfaden verwende ich oft eine Funktion, die den abschließenden Schrägstrich hinzufügt, wenn er nicht bereits vorhanden ist. Dann können Pfade wie folgt aufgebaut werden:
Dabei fügt fs () bei Bedarf einen abschließenden Schrägstrich hinzu.
quelle
Ordner und Dateien unterscheiden sich nur in einem Aspekt: Ordner enden mit einem Schrägstrich, Dateien nicht. Darüber hinaus beginnen absolute Pfade mit einem Punkt, an
/
dem relative Pfade nicht vorkommen. Wenn Sie dies verwenden, sollte es kein Problem sein, Pfade und Dateien konsistent miteinander zu verknüpfen.Die Verknüpfung zweier absoluter Pfade macht keinen Sinn, da der zweite Pfad relativ zum ersten Pfad sein sollte. Die Verknüpfung zweier relativer Pfade ist kein Problem, kann jedoch zu undefiniertem Verhalten führen, wenn das Programm nicht weiß, wo sich der relative Pfad befindet.
quelle
var a = "/my/path" + "css/" + "test.css"; //Output: "/my/pathcss/test.css"
absolutepath
hätte mit einem Schrägstrich enden sollen, weil es ein Pfad ist. Irgendwie habe ich das übersehen, als ich das geschrieben habe.Ich denke, es gibt keine Magie oder "gängige Praxis" für die Implementierung von Pfaden, aber die Verkettung von Zeichenfolgen ist sicherlich nicht der richtige Weg. Sie können Ihre eigene API für die Bearbeitung von Fällen entwickeln, dies kann jedoch einige Anstrengungen erfordern. Insbesondere sollten Sie mit unterschiedlichen Plattformen vorsichtig sein. Beispielsweise ist in Windows
\
das Trennzeichen, während in Unix-basierten Systemen/
das Trennzeichen ist.Ich bin nicht mit Javascript-Bibliotheken vertraut, aber ich bin mir sicher, dass es Bibliotheken für die Behandlung dieser Fälle geben sollte. In Java können Sie beispielsweise die Pfad- API verwenden, um plattformunabhängige Pfadvorgänge zu verarbeiten.
quelle
/
als Pfaddateibegrenzer. Dies erfordert Macken in der Befehlszeile, aber Datei-E / A-APIs funktionieren gut mit Schrägstrichen.Meine persönliche Präferenz ist folgende:
Ich benutze immer absolute Pfade (
/images/...
), es fühlt sich für mich weniger fehleranfällig an. Es ist auch einfacher zu verwenden,var sounds = assets+"/sounds"
denn selbst wenn Sieassets
einen abschließenden Schrägstrich hätten und am Ende einen hätten/images//sounds
, würde er sich dennoch auflösen/images/sounds
. Der einzige Haftungsausschluss ist, dass er von Ihrem Anforderungsbearbeiter abhängt. Apache scheint das in Ordnung zu bringen (zumindest bestimmte Versionen / Konfigurationen, siehe http://www.amazon.com//gp//site-directory//ref=nav_sad ). Auf die andere Art und Weise, die Ihnen/imagessounds
nichts ausmacht :) Es besteht auch die Möglichkeit, nach doppelten Schrägstrichen zu suchen und diese zu bereinigen. Keine Option mit dem anderen Ansatz.quelle
/
) beginnt, ein absoluter Pfad, kein relativer Pfad. Oder meintest du es nur für andere Streckenabschnitte als den ersten?/somewhere
ist dies ein relativer Pfad, da er den Host nicht enthält, sodass der Browser ihn basierend auf dem Host der aktuellen Seite nachschlägt. In der Webwelthttp://here/somewhere
ist er ein absoluter URI und/somewhereelse
relativ zu diesem. In der Dateisystemwelt/somewhere
ist es absolut und kommt von root/
. "Somewhereelse" ist relativ zum aktuellen Arbeitsverzeichnis.http://here/somewhere
ist ein URI mit einem absoluten Pfad,/somewhere
eine relative Referenz mit einem absoluten Pfad undsomewhere/else
eine relative Referenz mit einem relativen Pfad. Offensichtlich wird in diesen Kreisen "relativer Pfad" verwendet, um sich auf eine relative Referenz zu beziehen.In Smalltalk ist es einfach, die / -Methode in String so zu definieren, dass sie folgendermaßen funktioniert:
Hier ist eine einfache Implementierung der Methode (Sie können sie verbessern):
Hinweis : Sie können auch eine bessere Aufmerksamkeit auf Grenzfälle wie zahlen wollen
'' / ''
,'x/' / ''
etc., um das richtige Verhalten zu bestimmen.quelle