Dans un exemple:
var assets = "images/"
var sounds = assets+"sounds/"
Est-il plus conventionnel de mettre la barre oblique à l'arrière d'un chemin de fichier?
var assets = "/images"
var sounds = assets+"/sounds"
Y at-il une autre méthode qui est une bonne pratique courante?
conventions
file-structure
iiridescent
la source
la source
File.separator
, les APIFile
etPath
acceptent les deux/
et `\`.Réponses:
Presque tous les principaux langages de programmation ont une bibliothèque pour gérer les séparateurs de répertoires pour vous. Vous devriez les exploiter. Cela simplifiera votre code et évitera les bugs .
D'après mon expérience, la raison habituelle pour combiner des chaînes de ce type est qu'elles proviennent de sources différentes. Parfois, il s'agit de pièces différentes d'un fichier de configuration. Parfois, c'est une combinaison constante avec un argument de fonction. Dans tous les cas, quand ils proviennent de sources différentes, vous devez considérer plusieurs cas possibles concernant les séparateurs aux extrémités à combiner:
"images/"
et"/sounds"
"images"
et"/sounds"
ou"images/"
et"sounds"
"images"
et"sounds"
Le fait que chaque partie provienne d'une source différente signifie que chaque source peut avoir ses propres idées sur les conventions à suivre, si quelqu'un y réfléchit du tout! Tout ce qui appelle votre code ne devrait pas avoir à s'inquiéter de cela . Votre code doit gérer tous les cas, car quelqu'un violera votre convention . Cela se traduira par une perte de temps pour rechercher la cause d'une erreur et apporter une solution. À plusieurs reprises, un collègue a supposé que les chemins d'accès devaient être formatés dans un fichier de configuration, ce qui signifiait que je devais rechercher le code et déterminer ce à quoi il s'attendait (ou le corriger).
La plupart des langues principales fournissent une méthode pour le faire pour vous, qui gère déjà de nombreux cas:
os.path.join
pour PythonFile.join
pour RubyPath.join
pour Node.jsPaths.get
pour Java (7 ans et plus)Path.Combine
pour .NETIl y a une mise en garde avec ceux-ci. Un certain nombre d'entre eux semblent supposer qu'un séparateur de répertoire en tête dans le deuxième argument fait référence à un chemin racine, ce qui signifie que le premier argument doit être entièrement supprimé. Je ne sais pas pourquoi c'est considéré comme utile. pour moi, cela ne fait que poser des problèmes. Je n'ai jamais voulu combiner deux portions de chemin et finir par abandonner la première. Lisez attentivement la documentation pour les cas particuliers et, si nécessaire, écrivez un wrapper qui fait ce que vous voulez avec ceux-ci au lieu de leur traitement spécial.
Cela aide également si vous avez besoin de prendre en charge différents systèmes d'exploitation. Presque partout, ces classes expliquent le choix du bon séparateur. Les bibliothèques disposent généralement d’un moyen de normaliser les chemins pour s’adapter aux conventions du système d’exploitation.
Au cas où votre langage de programmation ne dispose pas d'une bibliothèque facilement disponible, vous devez écrire une méthode qui gère tous ces cas et l'utiliser de manière libérale et entre projets.
Cela tombe dans la catégorie "ne faites pas de suppositions" et "utilisez des outils qui vous aident".
la source
C:\Documents and Settings\Admin
avecmy folder:document.txt
un système * nix pour produire/home/admin/my folder/document.txt
- un joli tour, mais dans le monde réel, les heuristiques impliquées introduisaient plus de bugs qu’elles ne corrigeaient.Paths.get()
convertit simplementString
unPath
objet unique en objet. Pour rejoindre des chemins, vous utiliseriezPath.resolve()
ce qui peut en prendre un autrePath
ou unString
. Il existe d'autres méthodes dans laPath
classe qui permettent en outre de joindre des chemins de différentes manières.Paths
très bien.[System.IO.Path]::Combine("abc", "\def")
qui a le comportement décrit, est l'applet de commandeJoin-Path "abc" "\def"
qui donne"abc\def"
.En Java, la réponse serait "ni l'un ni l'autre". La meilleure pratique serait d’assembler des noms de chemins en utilisant la
java.io.File
classe; par exempleLa
File
classe prend également en charge les séparateurs de noms de chemins spécifiques à la plate-forme.Il y a une question distincte de savoir si votre chemin doit commencer par une barre oblique ou non. Mais cela relève plus de l’exactitude que de la meilleure pratique. Un chemin qui commence par un slash signifie autre chose qu'un chemin qui ne le fait pas !!
Il n’existe pas de support explicite pour la gestion des noms de chemins dans la bibliothèque Javascript principale (ECMA), mais (au moins) Node.js fournit un support via le module Path.
la source
os.path.join
. PowerShell ajoin-path
. Je voudrais ajouter quelque chose à cette réponse. J'ai constaté que si vous aviez besoin de chemins de fichiers multiples, votre code serait très fragile si vous supposiez que l'un d'entre eux avait des chemins de fichiers situés à des emplacements particuliers. L'utilisation de ces classes facilite non seulement la portabilité, mais elle gère également tous les cas de figure possibles (barre oblique des deux côtés à joindre, barre oblique d'un seul côté, aucune barre oblique entre les deux). Cette flexibilité est inestimable lorsque vous déposez des chemins de fichiers dans un fichier de configuration.Notez que dans .NET, vous devez utiliser la méthode Path.Combine.
La raison en est qu’elle «connaît» les caractères corrects à utiliser lors de la construction des noms de dossier.
Cela supprime le "problème" de pré ou post-fixation.
la source
os.path.join('src', '../../../your_secret_stuff')
est valide en Python; en d'autres termes, n'utilisez pas aveuglément ces méthodes lors de la saisie de l'utilisateur.Lors de la construction de chemins, j'utilise souvent une fonction qui ajoute la barre oblique finale si elle n’y figure pas déjà. Ensuite, les chemins peuvent être construits comme:
où fs () ajoute une barre oblique finale si nécessaire.
la source
Les dossiers et les fichiers ne diffèrent que par un aspect: les dossiers se terminent par une barre oblique, contrairement aux fichiers. De plus, les chemins absolus commencent par un
/
cas où les chemins relatifs ne le sont pas. Si vous utilisez ceci systématiquement, concaténer les chemins et les fichiers ne devrait poser aucun problème.Concaténer deux chemins absolus n'a aucun sens, car le deuxième chemin doit être relatif au premier. La concaténation de deux chemins relatifs ne pose pas de problème, mais peut conduire à un comportement indéfini si le programme ne sait pas où le chemin relatif est relatif.
la source
var a = "/my/path" + "css/" + "test.css"; //Output: "/my/pathcss/test.css"
absolutepath
aurait dû se terminer par une barre oblique, parce que c'est un chemin. D'une manière ou d'une autre, j'ai oublié cela quand j'ai écrit ceci.Je pense qu'il n'y a pas de magie ou de "pratique courante" sur la manière de mettre en œuvre des chemins, mais la concaténation de chaînes n'est certainement pas la solution. Vous pouvez développer votre propre API pour traiter les cas, mais cela peut nécessiter des efforts. En particulier, vous devez faire attention aux différentes plates-formes. Par exemple, dans Windows,
\
le séparateur, tandis que dans les systèmes Unix, il/
est le séparateur.Je ne connais pas bien les bibliothèques Javascript, mais je suis sûr qu'il devrait exister des bibliothèques pour gérer ces cas. En Java, par exemple, vous pouvez utiliser l' API Path pour gérer les opérations de chemin indépendantes de la plate-forme.
la source
/
le délimiteur de nom de fichier de chemin d'accès. Cela nécessite des bizarreries dans la ligne de commande, mais les API d'E / S sur fichier fonctionnent parfaitement avec une barre oblique.Ma préférence personnelle est la suivante:
J'utilise toujours des chemins absolus (
/images/...
), cela me semble moins sujet aux erreurs. Il est également plus facile de l'utiliservar sounds = assets+"/sounds"
car même siassets
une barre oblique de fin et vous avez fini avec/images//sounds
, il serait toujours résoudre à/images/sounds
. Le seul déni de responsabilité étant que cela dépend de votre gestionnaire de demandes. Apache semble bien le gérer (au moins certaines versions / configurations, voir http://www.amazon.com//gp//site-directory//ref=nav_sad ). Dans l’autre cas, vous vous retrouveriez avec/imagessounds
, pas si mal à l’aise :) Il est également possible de vérifier les doubles barres obliques et de les nettoyer. Pas une option avec l'autre approche.la source
/
) est un chemin absolu , pas un chemin relatif. Ou avez-vous voulu dire cela uniquement pour les sections de chemin autres que la première?/somewhere
s'agit d'un chemin relatif, car il n'inclut pas l'hôte. Le navigateur le recherchera donc en fonction de l'hôte de la page en cours ... Dans le monde Web, ilhttp://here/somewhere
s'agit d'un URI absolu et/somewhereelse
relatif à celui-ci. Dans le monde du système de fichiers,/somewhere
absolu, venant de la racine/
, et "quelque part" est relatif au répertoire de travail en cours.http://here/somewhere
est un URI avec un chemin absolu,/somewhere
une référence relative avec un chemin absolu etsomewhere/else
une référence relative avec un chemin relatif. Apparemment, dans ces cercles, "chemin relatif" est utilisé pour désigner une référence relative.En Smalltalk, il est simple de définir la méthode / dans String afin qu’elle fonctionne comme suit:
Voici une implémentation simple de la méthode (vous pouvez l'améliorer):
Remarque : vous pouvez également payer une plus grande attention aux cas frontaliers tels que
'' / ''
,'x/' / ''
, etc., afin de déterminer le comportement approprié.la source