Nome do arquivo? Nome do caminho? Nome base? Nomeação de padrão para partes de um caminho

228

Fico me intrometendo quando manipulo caminhos e nomes de arquivos, porque não tenho um sistema de nomes comum que uso.

Eu preciso criar um padrão de nomenclatura e cumpri-lo, e gostaria de ser claro e consistente com os outros, por isso estou me abrindo para aprender as respostas canônicas.

Considere este problema de brinquedo: (exemplo do Windows, mas espero que a resposta deva ser independente da plataforma)

Você recebeu o nome completo de uma pasta: C: \ users \ OddThinking \ Documents \ My Source. Você deseja percorrer as pastas abaixo e compilar todo o .src no .obj.

Em algum momento, você está olhando para a seguinte sequência.

C:\users\OddThinking\Documents\My Source\Widget\foo.src

Então, quais nomes de identificador você usaria para as partes?

A) foo
B) foo.src
C) src
D) .src
E) C:\users\OddThinking\Documents\My Source\ - i.e. the top of the tree.
F) Widget\foo.src - i.e. the path from the top of the tree to the leaf.
G) Widget - i.e. one node of the tree.
H) C:\users\OddThinking\Documents\My Source\Widget\ - i.e. the name of the folder
I) C:\users\OddThinking\Documents\My Source\Widget\foo.src

Deixe-me dar algumas respostas, para você começar.

A) nome base?

B) nome do arquivo? Ou é o nome do arquivo? A diferença é importante ao escolher nomes de identificadores e nunca sou consistente aqui.

C) Extensão

D) Extensão. Espere, foi assim que chamei C. Devo evitar armazenar o ponto e inseri-lo quando necessário? E se não houver ponto em um arquivo específico?

H) nome do caminho? Ou espere, é apenas o caminho?

I) nome do arquivo. Espere, foi assim que chamei C. Path. Espere, foi assim que chamei H. Talvez H deva ser o nome da pasta. "Pasta" não é um termo específico do Windows?

Oddthinking
fonte
Mike Pope, editor técnico da Microsoft, destaca em seu blog que, embora o guia de estilo da Microsoft atue consistentemente em duas palavras: nome do arquivo, nome da pasta, nome do volume, o Apple Style Guide às vezes se junta a eles: nome do arquivo, nome do caminho, nome do volume .
Oddthinking
A) definitivamente não deve ser chamado de nome de base, porque o nome de base já é usado em muitos lugares para significar o último item de um caminho (para um arquivo, esse seria o nome do arquivo sem o caminho de diretório). Alguns lugares chamam o nome do arquivo sem extensão de stem.
23616 wisbucky
Além disso, para arquivos com vários períodos (por exemplo, foo.src.txt), existe alguma maneira padrão de identificar (e nomear) as extensões?
user117529

Respostas:

178

Eu acho que sua busca por uma convenção de nomenclatura "padrão" será em vão. Aqui estão minhas propostas, com base em programas existentes e conhecidos:

A) C: \ usuários \ OddThinking \ Documents \ Minha fonte \ Widget \ foo .src

O Vim o chama de raiz do arquivo (: help filename-modifiers)

B) C: \ usuários \ OddThinking \ Documents \ Minha fonte \ Widget \ foo.src

nome do arquivo ou nome base

C) C: \ usuários \ OddThinking \ Documents \ Minha fonte \ Widget \ foo. src (sem ponto)

extensão de arquivo / nome

D) C: \ usuários \ OddThinking \ Documents \ Minha fonte \ Widget \ foo .src (com ponto)

também extensão de arquivo . Simplesmente armazene sem o ponto, se não houver ponto em um arquivo, ele não terá extensão

E) C: \ users \ OddThinking \ Documents \ Minha fonte \ Widget \ foo.src

topo da árvore
Nenhuma convenção, o git chama de diretório base

F) C: \ usuários \ OddThinking \ Documents \ Minha fonte \ Widget \ foo.src

caminho do topo da árvore para o
caminho relativo da folha

G) C: \ usuários \ OddThinking \ Documents \ Minha fonte \ Widget \ foo.src

um nó da árvore
sem convenção, talvez um diretório simples

H) C: \ usuários \ OddThinking \ Documents \ Minha fonte \ Widget \ foo.src

nome do diretório

I) C: \ users \ OddThinking \ Documents \ Minha fonte \ Widget \ foo.src

caminho completo / absoluto

blinry
fonte
8
Está ficando fora de tópico, mas tenha cuidado com o armazenamento da extensão separado para o ponto. Você precisa manipular os nomes de arquivos "foo", "foo". e "foo.txt" (e até mesmo "foo.txt.bak".)
Oddthinking
1
oi pessoal, ótimo exemplo. Seria mais fácil ler se você colocasse a resposta ao lado da pergunta, em vez de usar referências que obram a rolar para cima. A propósito, eu faço uma edição para melhorar isso. Grettings
Victor
3
Victor, desde a sua edição foi rejeitado (wtf caras, esta é uma melhora muito boa!) Eu só fiz isso :-)
blinry
1
Para 1.(nome do arquivo apenas sem extensão), decidi File Titleconcordar há muito tempo devido à falta de uma convenção clara ou pelo menos a um consenso global.
polyvertex
1
Para A(nome do arquivo sem extensão), você pode usar stem. Referências: doc.rust-lang.org/std/path/struct.Path.html#method.file_stem , llvm.org/docs/doxygen/html/… , boost.org/doc/libs/1_60_0/libs/filesystem/ doc /…
wisbucky 17/03
36

Boa pergunta antes de tudo, meu +1. Isso me incomodou quando tive que criar uma série de funções na classe Utility uma vez. GetFileName? ou GetFullName? GetApplicationPath significa caminho completo ou o nome do diretório? e assim por diante. Eu sou do .NET background, então acho que posso acrescentar um pouco mais à excelente resposta de @blinry.

Resumo: (em itálico é o que eu não usaria como programador)

  1. Caminho : Caminho especifica um local exclusivo no sistema de arquivos (a menos que seja o caminho relativo). O nome do caminho é usado com menos frequência, mas eu ficaria com o caminho - explica praticamente o que é. O caminho pode apontar para um arquivo ou uma pasta ou até mesmo nada (C: \). O caminho pode ser:

    1. Caminho relativo : também My Source\Widget\é um caminho relativo Widget\foo.src. Auto-explicativo.
    2. Caminho absoluto ou caminho completo : é o caminho totalmente qualificado que aponta para o destino. Eu costumo usar o último com mais frequência. C:\users\OddThinking\Documents\My Source\Widget\foo.srcé, portanto, o caminho completo. Veja no final o que chamo de caminho completo que aponta para um arquivo e que termina como um diretório.

    A página da wiki e a nomenclatura do .NET para path são consistentes.

  2. Caminho raiz ou diretório raiz : anterior é a convenção do .NET, enquanto a última é mais ouvida nos círculos UNIX. Embora eu goste de ambos, costumo usar mais o primeiro. No Windows, diferentemente do UNIX, possui muitos caminhos raiz diferentes, um para cada partição. Os sistemas Unix têm um diretório raiz que contém informações sobre outros diretórios e arquivos. Por exemplo. C:\é o caminho raiz.

  3. Pasta ou Nome da Pasta : Widget, OddThinkingetc no seu caso. Esta pode ser uma convenção apenas para Windows (de fato, é o meu próprio pensamento estranho :)), no entanto, sou contra a resposta ofuscante "Diretório". Embora para um diretório de usuário normal signifique o mesmo que uma pasta (como subpastas, subdiretórios), acredito que, de um ângulo técnico, o "diretório" deve soar como um endereço qualificado para o destino, e não o próprio destino. Mais abaixo.

    1. Subpastas : com relação a users OddThinkinge Documentssão subpastas.
    2. Subdiretórios : Com relação a users OddThinking\, OddThinking\Documents\e OddThinking\Documents\My Source\Widget\são subdiretórios. Mas nem sempre precisamos nos preocupar com isso, precisamos?
    3. Pasta filho : em relação a users OddThinkinguma pasta filho (e também à subpasta)
    4. Pasta pai : For OddThinking usersé sua pasta pai (apenas mencionando terminologias diferentes, não é grande coisa).
  4. Diretório ou nome do diretório : o primeiro a ser usado geralmente na vida real, o segundo a ser em código. Refere-se ao caminho completo (ou simplesmente ao caminho completo ) até a pasta pai do destino . No seu caso, C:\users\OddThinking\Documents\My Source\Widget(Sim, um diretório nunca deve apontar para um arquivo). Eu uso o nome do diretório no meu código, pois directory é uma classe no .NET e Directory Name é o que a própria biblioteca chama. É bastante consistente com o dirname usado nos sistemas UNIX.

  5. Nome do arquivo ou nome da base : nome do arquivo junto com a extensão. No seu caso: foo.src. Eu diria que, para um uso não técnico, prefiro o nome do arquivo (é o que isso significa para o usuário final), mas, para fins técnicos, eu continuaria estritamente com o nome da base . Nome do arquivo é frequentemente usado pelo MS, mas estou surpreso como eles não são consistentes, não apenas na documentação, mas também na biblioteca . O nome do arquivo pode significar nome da base ou caminho completo do arquivo. Então, eu sou a favor do nome da base, é assim que os chamo de código. Esta página no wiki também diz que o nome do arquivo pode significar o caminho completo ou o nome da base. Surpreendentemente, mesmo no .NET, posso encontrar o nome de base de uso como o nome raiz do arquivo.

  6. Extensão ou extensão de nome de arquivo ou extensão de arquivo : Eu gosto da última. Tudo se refere à mesma coisa, mas o que é isso é novamente uma questão de debate! O Wiki diz que faz srcalgum tempo que eu lembro de ler que muitos dos idiomas o interpretam como .src. Observe o ponto. Então, mais uma vez, minha opinião é que, para usos casuais, não importa o que seja, mas como programador sempre vejo a extensão como .src.

    Ok, eu poderia ter tentado buscar alguns usos padrão, mas aqui estão duas das minhas convenções que sigo. E é sobre caminhos completos.

    1. Eu geralmente chamo um caminho completo que aponta para um arquivo como caminho do arquivo . Para mim, o caminho do arquivo é claro, ele me diz o que é. Embora com nome do arquivo eu o encontre como o nome do arquivo, no meu código eu o chamo de nome do arquivo . Também é consistente com " nome do diretório ". Do lado técnico, nome refere-se ao nome totalmente qualificado! Frustrantemente, o .NET usa o termo nome do arquivo (por isso, tenho meu caso aqui) e, às vezes, o caminho do arquivo.

    2. Eu chamo um caminho completo que termina como diretório, diretório. De fato, pode-se chamar qualquer endereço que não aponte para um arquivo como diretório. Assim, C:\users\OddThinking\Documents\My Source\é um diretório, C:\users\OddThinking\é um diretório, ou até mesmo OddThinking\Documents\My Source\(melhor chamá-lo de subdiretório ou ainda melhor caminho relativo - tudo isso depende do contexto em que você está lidando com ele). Bem acima, mencionei algo diferente sobre o diretório, que é o nome do diretório. Aqui está a minha opinião: vou pegar um novo caminho para evitar confusão. O que é isso D:\Fruit\Apple\Pip\? Um diretório Mas se a pergunta é qual é o diretório ou o nome do diretório ainda melhor D:\Fruit\Apple\Pip\, a resposta é D:\Fruit\Apple\. Espero que esteja claro.

    Eu diria que é melhor não se preocupar com os dois termos finais, pois é isso que cria mais confusão (para mim, pessoalmente). Basta usar o termo caminho completo !

Para lhe responder:

  1. com relação ao caminho que você deu

    A) Não faço ideia. De qualquer forma, eu nunca precisei pegar esse sozinho.

    B) nome base

    C) Eu chamaria isso de extensão de arquivo por enquanto, estou menos preocupado, pois nunca precisei que isso fosse mencionado no meu código.

    D) extensão de arquivo certamente.

    E) Não acho que esse seja um requisito de uso geral. Nenhuma idéia. No diretório base do .NET, é o mesmo que o nome do diretório.

    F) caminho relativo

    G) pasta (pasta pai para o nome da base foo.src)

    H) nome do diretório

    I) caminho completo (ou mesmo nome do arquivo)

  2. em geral (desculpe por ser um pouco detalhado, apenas para esclarecer as coisas), mas supondo que foo.srcseja realmente um arquivo

    A) NA

    B) nome base

    C) NA

    D) extensão

    E) diretório ou simplesmente caminho

    F) caminho relativo

    G) NA

    H) diretório ou simplesmente caminho

    I) caminho completo (ou mesmo nome do arquivo)

Condução adicional com um exemplo do meu lado:

  1. Considere o caminho C:\Documents and Settings\All Users\Application Data\s.sql.

    1. C:\Documents and Settings\All Users\Application Data\s.sql é o caminho completo (que é um nome de arquivo)
    2. C:\Documents and Settings\All Users\Application Data\ é o nome do diretório
  2. Agora considere o caminho C:\Documents and Settings\All Users\Application Data

    1. C:\Documents and Settings\All Users\Application Data é o caminho completo (que passa a ser um diretório)
    2. C:\Documents and Settings\All Users é o nome do diretório

Duas dicas minhas:

  1. Sigo esta regra geral: quando se trata de endereçar um endereço completo, independentemente do seu tipo, quase sempre o chamo de "caminho completo". Isso não apenas elimina o uso de duas terminologias para o caminho do arquivo e o caminho da pasta, mas também evita possíveis confusões se você quiser nomear o nome do arquivo como nome do arquivo (o que para a maioria dos usuários imediatamente se traduz em nome de base). Mas sim, se você precisar ser específico sobre o tipo de caminho, é melhor nomear que nome ou diretório de arquivo, em vez de "caminho" mais genérico.

  2. Seja o que for, você teria sua própria idéia em mente, seja consistente com ela o tempo todo. Tenha um consenso entre os membros da equipe de que isso significa isso e não aquilo.

Agora que apenas do círculo eu tenho alguma prática. Uma nova marca de termos seria o que é usado no OS X e nas máquinas Android. E todos esses são apenas caminhos físicos no sistema de arquivos. Um novo conjunto de terminologias surgiria no caso de endereços da web. Espero que alguém preencha o vazio nesse mesmo tópico :) Eu ficaria feliz em ouvir a convenção com a qual você foi adiante.

nawfal
fonte
Há muito tempo que uso a palavra "nome do caminho" para significar todo o caminho absoluto, incluindo o nome completo do arquivo. Sua resposta, outras pessoas aqui e recursos em outros lugares mudaram de idéia sobre isso, e agora usarei a palavra "caminho completo" para isso, "caminho" para o local sem nome do arquivo e "nome do arquivo" ou "nome" para o nome do arquivo em si.
Nate
24

No C ++, o Boost.Filesystem criou uma nomenclatura para as várias partes de um caminho. Consulte a documentação de referência da decomposição do caminho para obter detalhes, assim como este tutorial .

Aqui está um resumo com base no tutorial. Para:

  • Caminho do Windows: c:\foo\bar\baa.txt
  • Caminho Unix: /foo/bar/baa.txt

você obtém:

Part            Windows          Posix
--------------  ---------------  ---------------
Root name       c:               <empty>
Root directory  \                /
Root path       c:\              /
Relative path   foo\bar\baa.txt  foo/bar/baa.txt
Parent path     c:\foo\bar       /foo/bar
Filename        baa.txt          baa.txt
Stem            baa              baa
Extension       .txt             .txt

Norma C ++ ISO / IEC 14882: 2017

Além disso, a terminologia Boost.Filesystem foi adotada pelo C ++ 17 => Seestd::filesystem

Function name     Meaning
----------------  -------------------------------
root_name()       Root-name of the path
root_directory()  Root directory of the path
root_path()       Root path of the path
relative_path()   Path relative to the root path
parent_path()     Path of the parent path
filename()        Path without base directory (basename)
stem()            Filename without extension
extension()       Component after last dot
Emile Cormier
fonte
6
Como eles chamam a coisa toda então? path, fullpath?
23616 wisbucky
@wisbucky A coisa toda é chamada de "caminho" em sua nomenclatura.
Emile Cormier
1
@wisbucky Corrigido o link. Obrigado.
Emile Cormier
@olibre: Obrigado pela atualização do C ++ 17. Mas stem()faz parte do nome do arquivo , não do caminho .
Emile Cormier
1
@ johnc.j. É muito ruim o Boost.Filesystem não ser tão conhecido quando a pergunta foi feita pela primeira vez. Prefiro adotar a nomenclatura de uma biblioteca revisada por pares a inventar algo sozinho.
Emile Cormier
9

A pathlibbiblioteca padrão do Python possui uma excelente convenção de nomenclatura para os componentes do caminho: https://docs.python.org/3/library/pathlib.html

a) C: \ usuários \ OddThinking \ Documents \ Minha fonte \ Widget \ foo .src

haste

b) C: \ usuários \ OddThinking \ Documents \ Minha fonte \ Widget \ foo.src

nome

c) C: \ usuários \ OddThinking \ Documents \ Minha fonte \ Widget \ foo. src (sem ponto)

[nada]

d) C: \ usuários \ OddThinking \ Documents \ Minha fonte \ Widget \ foo .src (com ponto)

sufixo

e) C: \ usuários \ OddThinking \ Documents \ Minha fonte \ Widget \ foo.src

caminho dos pais

f) C: \ usuários \ OddThinking \ Documents \ Minha fonte \ Widget \ foo.src

caminho relativo ao caminho do pai principal

g) C: \ usuários \ OddThinking \ Documents \ Minha fonte \ Widget \ foo.src

nome dos pais

h) C: \ usuários \ OddThinking \ Documents \ Minha fonte \ Widget \ foo.src

caminho dos pais

i) C: \ users \ OddThinking \ Documents \ Minha fonte \ Widget \ foo.src

caminho

Maggyero
fonte
8

Não, você não é louco.

Nos sistemas Windows, às vezes o caminho do diretório que contém o arquivo é chamado de caminho , como era desde o início. Então, por exemplo,

    x:\dir1\dir2\myfile.txt

    Windows:
    --------
        PATH:  x:\dir1\dir2
        FILE:  myfile.txt

    Unix/Linux:
    -----------
        PATH:  /dir1/dir2/myfile.txt
        FILE:  myfile.txt

A abordagem Unix / Linux é muito mais lógica, e é isso que todos mencionaram acima: caminho incluindo o nome do arquivo. No entanto, se você digitar "ligar /?" na linha de comando do Windows, você obtém o seguinte:

    %~1         - expands %1 removing any surrounding quotes (")
    %~f1        - expands %1 to a fully qualified path name
    %~d1        - expands %1 to a drive letter only
    %~p1        - expands %1 to a path only
    %~n1        - expands %1 to a file name only
    %~x1        - expands %1 to a file extension only

Portanto, existe "somente caminho" e "apenas nome do arquivo". Ao mesmo tempo, eles se referem a toda a cadeia como "nome completo do caminho", que é entendido como letra da unidade mais caminho mais nome do arquivo. Portanto, não há verdade real. Isso é fútil. Você foi traído.

De qualquer forma,

Para responder sua pergunta

É assim que eu nomearia seus exemplos:

A: -
B: basename
C: extension
D: -
E: -
F: -
G: -
H: pathname (or dirname or containing path)
I: full name

O ADEF não possui apelidos simples. E como o php é provavelmente a linguagem de plataforma cruzada mais conhecida, todo mundo entende "basename" e "dirname", então eu continuaria com esse nome. Nome completo também é óbvio; o caminho completo seria um pouco ambíguo, mas na maioria das vezes significa exatamente a mesma coisa.

dkellner
fonte
1
Há muito tempo que uso a palavra "nome do caminho" para significar todo o caminho absoluto, incluindo o nome completo do arquivo. Outras respostas aqui e recursos em outros lugares mudaram de idéia sobre isso, e agora usarei a palavra "caminho completo" para isso, "caminho" para o local sem nome do arquivo e "nome do arquivo" ou "nome" para o próprio nome do arquivo.
Nate