En un ejemplo:
var assets = "images/"
var sounds = assets+"sounds/"
¿Es más convencional poner la barra en la parte posterior de una ruta de archivo?
var assets = "/images"
var sounds = assets+"/sounds"
¿Existe otro método que sea una buena práctica común?
conventions
file-structure
iridiscente
fuente
fuente
File.separator
embargo, rara vez necesita usarlos ,File
y lasPath
API aceptan ambos/
y `\`.Respuestas:
Casi todos los principales lenguajes de programación tienen una biblioteca para manejar los separadores de directorios por usted. Deberías aprovecharlos. Esto simplificará su código y evitará errores .
En mi experiencia, la razón habitual para combinar cadenas como esta es que provienen de diferentes fuentes. A veces son piezas diferentes de un archivo de configuración. A veces es una combinación constante con un argumento de función. En todos y cada uno de los casos, cuando provienen de diferentes fuentes, debe considerar varios casos posibles diferentes con respecto a los separadores en los extremos que se combinarán:
"images/"
y"/sounds"
"images"
y"/sounds"
o"images/"
y"sounds"
"images"
y"sounds"
El hecho de que cada parte provenga de una fuente diferente significa que cada fuente podría tener sus propias ideas sobre qué convenciones seguir, ¡si alguien pensara en ello! Lo que sea que llame a su código no debería tener que preocuparse por esto . Su código debe manejar todos los casos porque alguien violará su convención . Esto dará como resultado una pérdida de tiempo investigando la causa de un error y solucionando el problema. He tenido varias ocasiones desagradables en las que un compañero de trabajo hizo una suposición acerca de cómo se deben formatear las rutas en un archivo de configuración, lo que significa que tuve que buscar el código y averiguar qué estaban esperando (o arreglar el código).
La mayoría de los idiomas principales proporcionan un método para hacerlo que ya maneja muchos de los casos:
os.path.join
para PythonFile.join
para RubyPath.join
para Node.jsPaths.get
para Java (7 y superior)Path.Combine
para .NETHay una advertencia con estos. Varios de estos parecen suponer que un separador de directorio principal en el segundo argumento se refiere a una ruta raíz y que esto significa que el primer argumento debe descartarse por completo. No sé por qué esto se considera útil; para mí, solo causa problemas. Nunca he querido combinar dos porciones de ruta y terminar con la primera parte que se descarta. Lea la documentación detenidamente para casos especiales y, si es necesario, escriba un contenedor que haga lo que quiera con estos en lugar de su manejo especial.
Esto también ayuda si tiene alguna necesidad de soportar diferentes sistemas operativos. Estas clases casi ubicuamente explican la elección del separador correcto. Por lo general, las bibliotecas también tienen una forma de normalizar rutas para adaptarse a las convenciones del sistema operativo.
En el caso de que su lenguaje de programación no tenga una biblioteca fácilmente disponible, debe escribir un método que maneje todos estos casos y usarlo libremente y en todos los proyectos.
Esto cae en la categoría de "no haga suposiciones" y "use herramientas que lo ayuden".
fuente
C:\Documents and Settings\Admin
con éxitomy folder:document.txt
en un sistema * nix para producir/home/admin/my folder/document.txt
, un lindo truco, pero en el mundo real, la heurística involucrada introdujo más errores de los que arreglaron.Paths.get()
solo convierte un soloString
en unPath
objeto. Para unir rutas, usaríaPath.resolve()
, que puede incluir otraPath
o unaString
. Hay otros métodos en laPath
clase que permiten unir caminos de varias maneras.Paths
muy bien.[System.IO.Path]::Combine("abc", "\def")
que tiene el comportamiento descrito es el cmdletJoin-Path "abc" "\def"
que proporciona"abc\def"
.En Java, la respuesta sería "ninguna de las anteriores". La mejor práctica sería ensamblar nombres de ruta utilizando la
java.io.File
clase; p.ejLa
File
clase también se encarga de los separadores de nombre de ruta específicos de la plataforma.Existe un problema separado de si su nombre de ruta debe comenzar con una barra inclinada o no. Pero eso tiene más que ver con la corrección que con la mejor práctica. ¡Un nombre de ruta que comienza con una barra significa algo diferente a un nombre de ruta que no lo hace!
No hay soporte explícito para el manejo de nombres de ruta en la biblioteca Javascript central (ECMA), pero (al menos) Node.js brinda soporte a través del módulo Path.
fuente
os.path.join
. PowerShell tienejoin-path
. Yo agregaría algo a esta respuesta. He descubierto que si necesita rutas de archivo en varias partes, hace que su código sea muy frágil si hace suposiciones sobre cualquiera de ellas con rutas de archivo en lugares particulares. El uso de estas clases no solo ayuda con la portabilidad, sino que también maneja todos los casos de borde posibles (barra en ambos extremos para unir, barra en un solo lado, sin barra en absoluto). Esta flexibilidad es invaluable cuando se sueltan rutas de archivos en un archivo de configuración.Tenga en cuenta que en .NET debe usar el método Path.Combine.
La razón de esto es que 'conoce' los caracteres correctos que se utilizarán al construir los nombres de las carpetas.
Esto elimina el "problema" de la fijación previa o posterior.
fuente
os.path.join('src', '../../../your_secret_stuff')
es válido en Python; en otras palabras, no use ciegamente estos métodos en la entrada del usuario.Cuando construyo caminos a menudo uso una función que agrega la barra inclinada final si aún no está allí. Entonces se pueden construir caminos como:
donde fs () agrega una barra inclinada final si es necesario.
fuente
Las carpetas y los archivos difieren solo en un aspecto: las carpetas terminan con una barra diagonal donde los archivos no. Además, los caminos absolutos comienzan con un
/
camino relativo donde no lo hacen. Si utiliza esto constantemente concatenar rutas y archivos juntos no debería ser un problema.Concatenar dos rutas absolutas juntas no tiene sentido, ya que la segunda ruta debe ser relativa a la primera ruta. Concatenar dos rutas relativas juntas no es un problema, pero podría conducir a un comportamiento indefinido si el programa no sabe a dónde se relaciona la ruta relativa.
fuente
var a = "/my/path" + "css/" + "test.css"; //Output: "/my/pathcss/test.css"
absolutepath
debería haber terminado con una barra oblicua, porque es un camino. De alguna manera pasé por alto eso cuando escribí esto.Creo que no hay magia o "práctica común" sobre cómo implementar rutas, pero ciertamente la concatenación de cadenas no es el camino a seguir. Puede desarrollar su propia API para tratar casos, pero puede requerir cierto esfuerzo. En particular, debe tener cuidado con las diferentes plataformas. Por ejemplo, en Windows
\
es el separador, mientras que en los sistemas basados en Unix/
es el separador.No estoy familiarizado con las bibliotecas de Javascript, pero estoy seguro de que debería haber bibliotecas para manejar estos casos. En Java, por ejemplo, puede usar la API de ruta para tratar las operaciones de ruta independientes de la plataforma.
fuente
/
como delimitador de nombre de ruta. Esto necesita peculiaridades en la línea de comandos, pero las API de E / S de archivos funcionan bien con la barra diagonal.Mi preferencia personal es esta:
Siempre uso rutas absolutas (
/images/...
), me parece menos propenso a errores. También es una prueba más tonta de usarvar sounds = assets+"/sounds"
porque incluso siassets
tuviera una barra inclinada final y terminara/images//sounds
, aún se resolvería/images/sounds
. El descargo de responsabilidad es que depende de su controlador de solicitud. Apache parece manejarlo bien (al menos ciertas versiones / configuraciones, consulte http://www.amazon.com//gp//site-directory//ref=nav_sad ). De la otra manera que terminaría/imagessounds
, no es tan infalible :) También existe la opción de verificar si hay barras dobles y limpiarlas. No es una opción con el otro enfoque.fuente
/
) es una ruta absoluta , no relativa. ¿O lo quiso decir solo para secciones de ruta distintas a la primera?/somewhere
es una ruta relativa porque no incluye el host, por lo que el navegador lo buscará en función del host de la página actual ... En el mundo web,http://here/somewhere
es un URI absoluto, y/somewhereelse
es relativo a eso. En el mundo del sistema de archivos,/somewhere
es absoluto, proviene de la raíz/
, y "en otro lugar" es relativo al directorio de trabajo actual.http://here/somewhere
es un URI con una ruta absoluta,/somewhere
es una referencia relativa con una ruta absoluta ysomewhere/else
es una referencia relativa con una ruta relativa. Aparentemente, en esos círculos "ruta relativa" se usa para referirse a una referencia relativa.En Smalltalk es sencillo definir el método / en String para que funcione así:
Aquí hay una implementación simple del método (puede mejorarlo):
Nota : También puede ser que desee prestar más atención a los casos fronterizos, tales como
'' / ''
,'x/' / ''
, etc., con el fin de determinar el comportamiento apropiado.fuente