it-swarm.com.de

Gibt es eine herkömmliche Möglichkeit, Dateipfadzeichenfolgen zu kombinieren?

In einem Beispiel:

var assets = "images/"

var sounds = assets+"sounds/"

Ist es konventioneller, 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 üblich ist?

36
iiridescent

Nahezu jede wichtige Programmiersprache verfügt über eine Bibliothek, die die Verzeichnistrennzeichen für Sie verwaltet. Sie sollten sie nutzen. Dies vereinfacht Ihren Code und verhindert Fehler .

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, wenn sie aus verschiedenen Quellen stammen, müssen Sie verschiedene mögliche Fälle in Bezug auf die zu kombinierenden Trennzeichen an den Enden berücksichtigen:

  • Beide Enden könnten ein Trennzeichen haben: "images/" und "/sounds"
  • Nur einer hat ein Trennzeichen: "images" und "/sounds" oder "images/" und "sounds"
  • Weder hat ein Trennzeichen: "images" und "sounds"

Die Tatsache, dass jeder Teil aus einer anderen Quelle stammt, bedeutet, dass jede Quelle ihre eigenen Vorstellungen darüber haben könnte, welche Konventionen zu befolgen sind, wenn jemand überhaupt darüber nachdenkt! 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 mehrere unangenehme Gelegenheiten, in denen ein Mitarbeiter davon ausging, wie Pfade in einer Konfigurationsdatei formatiert werden sollten, was bedeutete, dass ich den Code suchen und herausfinden musste, was sie erwarteten (oder den Code reparieren).

Die meisten wichtigen Sprachen bieten eine Methode, um dies für Sie zu tun, die bereits viele der Fälle behandelt:

Es gibt eine Einschränkung bei diesen. Einige davon scheinen davon auszugehen, dass ein führendes Verzeichnistrennzeichen im zweiten Argument auf einen Stammpfad verweist und dass dies bedeutet, dass das erste Argument vollständig gelöscht werden sollte. Ich weiß nicht, warum dies als nützlich angesehen 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 Sonderfälle sorgfältig durch und schreiben Sie gegebenenfalls einen Wrapper, der mit diesen das macht, was Sie wollen, anstatt sie speziell zu behandeln.

Dies ist außerdem hilfreich, wenn Sie verschiedene Betriebssysteme unterstützen müssen. Diese Klassen sind fast allgegenwärtig für die Auswahl des richtigen Trennzeichens verantwortlich. Die Bibliotheken haben normalerweise die Möglichkeit, Pfade zu normalisieren, um sie auch an die Betriebssystemkonventionen anzupassen.

Für den Fall, dass Ihre Programmiersprache keine leicht verfügbare Bibliothek hat, sollten Sie eine Methode schreiben, die alle diese Fälle behandelt und sie großzügig und projektübergreifend verwenden .

Dies fällt in die Kategorie "Machen Sie keine Annahmen" und "Verwenden Sie Tools, die Ihnen helfen".

37
jpmc26

In Java wäre die Antwort "keine der oben genannten". Die beste Vorgehensweise wäre, Pfadnamen mit dem Java.io.File class; z.B.

File assets = new File("images");
File sounds = new File(assets, "sounds");

Die Klasse File kümmert sich auch um plattformspezifische Pfadnamen-Trennzeichen.

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 zu einem Pfadnamen, der dies nicht tut !!


Es gibt keine explizite Unterstützung für die Behandlung von Pfadnamen in der JMA-Skriptbibliothek (ECMA), aber (zumindest) Node.js bietet Unterstützung über das Pfadmodul.

38
Stephen C

Beachten Sie, dass Sie in .NET die Path.Combine-Methode verwenden sollten.

var path = System.IO.Path.Combine("assets", "sounds");

Der Grund dafür ist, dass es 'weiß' die richtigen Zeichen , die beim Erstellen der Ordnernamen verwendet werden sollen.

Dies beseitigt das "Problem" der Vor- oder Nachbehebung.

21
Erno

Beim Erstellen von Pfaden verwende ich häufig eine Funktion, die den abschließenden Schrägstrich hinzufügt, wenn er nicht bereits vorhanden ist. Dann können Pfade wie folgt gebaut werden:

filename := fs( 'assets') + fs( 'images') + fs( 'icons') + 'some.png';

dabei fügt fs () bei Bedarf einen abschließenden Schrägstrich hinzu.

5
GrandmasterB

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 / wo relative Pfade nicht. Wenn Sie dies verwenden, sollte es kein Problem sein, Pfade und Dateien konsistent miteinander zu verknüpfen.

var absolutepath = "/my/path/";
var relativepath = "css/";
var filename = "test.css";
var relativepathtofilename = "js/test.js";

var a = absolutepath + relativepath + filename; //Output: /my/path/css/test.css
var b = absolutepath + relativepathtofilename;  //Output: /my/path/js/test.js

Das Verketten von zwei absoluten Pfaden macht keinen Sinn, da der zweite Pfad relativ zum ersten Pfad sein sollte. Das Verketten von zwei relativen Pfaden ist kein Problem, kann jedoch zu undefiniertem Verhalten führen, wenn das Programm nicht weiß, wo sich der relative Pfad relativ befindet.

5
Sumurai8

Ich denke, es gibt keine Magie oder "gängige Praxis" beim Implementieren 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 bei verschiedenen Plattformen vorsichtig sein. Zum Beispiel in Windows \ ist das Trennzeichen in Unix-basierten Systemen / ist das Trennzeichen.

Ich bin nicht mit Javascript-Bibliotheken vertraut, aber ich bin sicher, dass es Bibliotheken geben sollte, um diese Fälle zu behandeln. In Java können Sie beispielsweise die API Path verwenden, um plattformunabhängige Pfadoperationen zu verarbeiten.

4
Wickoo

Meine persönliche Präferenz ist folgende:

var assets = "/images"

var sounds = assets+"/sounds"

Ich benutze immer absolute Pfade (/images/...), Es fühlt sich für mich weniger fehleranfällig an. Es ist auch narrensicherer, var sounds = assets+"/sounds" Zu verwenden, denn selbst wenn assets einen abschließenden Schrägstrich hätte und Sie am Ende /images//sounds Erhalten würden, würde es sich immer noch in /images/sounds Auflösen. . Der einzige Haftungsausschluss ist, dass dies von Ihrem Anforderungshandler abhängt. Apache scheint gut damit umzugehen (zumindest bestimmte Versionen/Konfigurationen, siehe http://www.Amazon.com//gp//site-directory//ref=nav_sad ). Mit der anderen Möglichkeit würden Sie /imagessounds Erhalten, nicht so narrensicher :) Es besteht auch die Möglichkeit, nach doppelten Schrägstrichen zu suchen und diese zu bereinigen. Keine Option mit dem anderen Ansatz.

0
rpaskett

In Smalltalk ist es einfach, die/-Methode in String so zu definieren, dass sie wie folgt funktioniert:

'assets' / 'sounds' => 'assets/sounds'.
'assets/' / 'sounds' => 'assets/sounds'.
'assets' / '/sounds' => 'assets/sounds'.
'assets/' / '/sounds' => 'assets/sounds'.

Hier ist eine einfache Implementierung der Methode (Sie können sie verbessern):

/ aString
    | slash first second |
    slash := Directory separator.
    first := self.
    (first endsWith: slash) ifTrue: [first := first allButLast].
    second := aString.
    (second beginsWith: slash) ifTrue: [second := second allButFirst].
    ^first , slash , second

Hinweis: Möglicherweise möchten Sie auch Grenzfällen wie '' / '', 'x/' / '' usw., um das richtige Verhalten zu bestimmen.

0