Em um exemplo:
var assets = "images/"
var sounds = assets+"sounds/"
É mais convencional colocar a barra na parte de trás do caminho de um arquivo?
var assets = "/images"
var sounds = assets+"/sounds"
Existe outro método que seja uma boa prática comum?
conventions
file-structure
iiridescente
fonte
fonte
File.separator
, porém, as APIsFile
ePath
aceitam ambos/
e `\`.Respostas:
Quase todas as principais linguagens de programação possuem uma biblioteca para lidar com os separadores de diretório para você. Você deve aproveitá-los. Isso simplificará seu código e evitará erros .
Na minha experiência, o motivo usual para combinar seqüências de caracteres como essa é que elas vêm de diferentes fontes. Às vezes, são partes diferentes de um arquivo de configuração. Às vezes, é uma combinação constante com um argumento de função. Em todo e qualquer caso, quando eles vêm de fontes diferentes, é necessário considerar vários casos possíveis diferentes em relação aos separadores nas extremidades a serem combinados:
"images/"
e"/sounds"
"images"
e"/sounds"
ou"images/"
e"sounds"
"images"
e"sounds"
O fato de cada parte vir de uma fonte diferente significa que cada fonte pode ter suas próprias idéias sobre quais convenções seguir, se alguém pensar em alguma coisa! O que quer que esteja chamando seu código não deve se preocupar com isso . Seu código deve lidar com todos os casos, porque alguém violará sua convenção . Isso resultará em perda de tempo investigando a causa de um erro e corrigindo. Eu tive várias ocasiões desagradáveis em que um colega de trabalho assumiu como os caminhos devem ser formatados em um arquivo de configuração, o que significa que eu tive que procurar o código e descobrir o que eles estavam esperando (ou consertar o código).
A maioria dos idiomas principais fornece um método para fazer isso para você que já lida com muitos dos casos:
os.path.join
para PythonFile.join
para RubyPath.join
para Node.jsPaths.get
para Java (7 ou superior)Path.Combine
para .NETHá uma ressalva com estes. Vários deles parecem supor que um separador de diretório principal no segundo argumento se refira a um caminho raiz e que isso significa que o primeiro argumento deve ser descartado inteiramente. Não sei por que isso é considerado útil; para mim, isso apenas causa problemas. Eu nunca quis combinar duas partes do caminho e terminar com a primeira parte sendo descartada. Leia a documentação cuidadosamente para casos especiais e, se necessário, escreva um invólucro que faça o que você deseja com eles, em vez de seu tratamento especial.
Isso também ajuda se você precisar de suporte para diferentes sistemas operacionais. Essas classes são quase onipresentes na escolha do separador correto. As bibliotecas geralmente também têm uma maneira de normalizar os caminhos para atender às convenções do sistema operacional.
No caso de sua linguagem de programação não ter uma biblioteca prontamente disponível, você deve escrever um método que lide com todos esses casos e use-o livremente e entre projetos.
Isso se enquadra na categoria de "não faça suposições" e "use ferramentas que o ajudem".
fonte
C:\Documents and Settings\Admin
com sucessomy folder:document.txt
em um sistema * nix para produzir/home/admin/my folder/document.txt
- um truque fofo, mas no mundo real, as heurísticas envolvidas introduziram mais erros do que consertaram.Paths.get()
apenas converte um únicoString
em umPath
objeto. Para ingressar em caminhos, você usaria oPath.resolve()
que pode incluir outroPath
ou aString
. Existem outros métodos naPath
classe que permitem a junção de caminhos de várias maneiras.Paths
muito bem.[System.IO.Path]::Combine("abc", "\def")
que possui o comportamento descrito, é o cmdletJoin-Path "abc" "\def"
fornecido"abc\def"
.Em Java, a resposta seria "nenhuma das opções acima". A melhor prática seria montar nomes de caminho usando a
java.io.File
classe; por exemploA
File
classe também cuida dos separadores de nome de caminho específicos da plataforma.Há uma questão separada sobre se o nome do caminho deve começar com uma barra ou não. Mas isso tem mais a ver com correção do que com as melhores práticas. Um nome de caminho que começa com uma barra significa algo diferente de um nome de caminho que não !!
Não há suporte explícito para manipulação de nome de caminho na biblioteca Javascript principal (ECMA), mas (pelo menos) o Node.js fornece suporte por meio do módulo Path.
fonte
os.path.join
. O PowerShell possuijoin-path
. Eu acrescentaria algo a esta resposta. Descobri que, se você precisar de caminhos de arquivo em várias partes, isso tornará seu código muito frágil se você fizer suposições sobre qualquer um deles possuindo caminhos de arquivo em locais específicos. O uso dessas classes não apenas ajuda na portabilidade, mas também lida com todos os casos possíveis de borda (barra nas duas extremidades a serem unidas, barra em apenas um lado, nenhuma barra entre elas). Essa flexibilidade é inestimável quando você solta os caminhos de arquivo em um arquivo de configuração.Observe que no .NET você deve usar o método Path.Combine.
A razão para isso é que ele 'conhece' os caracteres corretos a serem usados ao construir os nomes das pastas.
Isso elimina o 'problema' de pré ou pós-fixação.
fonte
os.path.join('src', '../../../your_secret_stuff')
é válido em Python; em outras palavras, não use cegamente esses métodos na entrada do usuário.Ao construir caminhos, geralmente uso uma função que adiciona a barra final, se ainda não estiver lá. Em seguida, os caminhos podem ser construídos como:
onde fs () adiciona uma barra final, se necessário.
fonte
Pastas e arquivos diferem apenas em um aspecto: as pastas terminam com uma barra onde os arquivos não. Além disso, os caminhos absolutos começam com um
/
onde os caminhos relativos não. Se você usar esse processo de concatenação consistente de arquivos e arquivos em conjunto, não haverá problema.Concatenar dois caminhos absolutos juntos não faz sentido, pois o segundo caminho deve ser relativo ao primeiro caminho. Concatenar dois caminhos relativos juntos não é problema, mas pode levar a um comportamento indefinido se o programa não souber onde o caminho relativo é relativo.
fonte
var a = "/my/path" + "css/" + "test.css"; //Output: "/my/pathcss/test.css"
absolutepath
deveria ter terminado com uma barra, porque é um caminho. De alguma forma, eu ignorei isso quando escrevi isso.Eu acho que não há mágica ou "prática comum" sobre como implementar caminhos, mas certamente a concatenação de strings não é o caminho a seguir. Você pode desenvolver sua própria API para lidar com casos, mas isso pode exigir algum esforço. Em particular, você deve ter cuidado com as diferentes plataformas. Por exemplo, no Windows
\
é o separador, enquanto nos sistemas baseados em Unix/
é o separador.Não conheço as bibliotecas Javascript, mas tenho certeza de que deve haver bibliotecas para lidar com esses casos. Em Java, por exemplo, você pode usar a API do Path para lidar com operações de caminho independentes da plataforma.
fonte
/
como delimitador de nome de arquivo do caminho. Isso precisa de peculiaridades na linha de comando, mas as APIs de E / S de arquivo funcionam bem com a barra.Minha preferência pessoal é esta:
Eu sempre uso caminhos absolutos (
/images/...
), isso me parece menos propenso a erros. Também é mais à prova de idiotas de usar,var sounds = assets+"/sounds"
porque, mesmo queassets
tivesse uma barra à direita e você acabasse com/images//sounds
, ainda assim resolveria/images/sounds
. O único aviso é que depende do seu manipulador de solicitações. O Apache parece lidar bem com isso (pelo menos em determinadas versões / configurações, consulte http://www.amazon.com//gp//site-directory//ref=nav_sad ). Por outro lado, você não terá/imagessounds
provas de idiotas :) Também existe a opção de verificar barras duplas e limpá-las. Não é uma opção com a outra abordagem.fonte
/
) é um caminho absoluto , não um caminho relativo. Ou você quis dizer isso apenas para seções de caminho diferentes da primeira?/somewhere
é um caminho relativo porque não inclui o host, portanto o navegador procurará com base no host da página atual ... No mundo da web,http://here/somewhere
é um URI absoluto e/somewhereelse
é relativo a isso. No mundo do sistema de arquivos,/somewhere
é absoluto, proveniente da raiz/
, e "someelse" é relativo ao diretório de trabalho atual.http://here/somewhere
é um URI com um caminho absoluto,/somewhere
é uma referência relativa com um caminho absoluto esomewhere/else
é uma referência relativa com um caminho relativo. Aparentemente, nesses círculos "caminho relativo" é usado para se referir a uma referência relativa.No Smalltalk, é fácil definir o método / em String para que funcione assim:
Aqui está uma implementação simples do método (você pode torná-lo melhor):
Nota : você também pode querer prestar mais atenção aos casos de fronteira, tais como
'' / ''
,'x/' / ''
, etc., a fim de determinar o comportamento adequado.fonte