Имя файла? Имя пути? Базовое имя? Стандарт именования для кусочков дорожки

228

Я продолжаю зацикливаться на манипуляциях с путями и именами файлов, потому что у меня нет общей системы именования, которую я использую.

Мне нужно придумать стандарт именования и придерживаться его, и я хотел бы быть ясным и последовательным с другими, поэтому я открываюсь, чтобы выучить канонические ответы.

Рассмотрим эту игрушечную проблему: (пример Windows, но, надеюсь, ответ должен быть независимым от платформы)

Вам было дано полное имя папки: C: \ users \ OddThinking \ Documents \ My Source. Вы хотите пройти по папкам внизу и скомпилировать все .src в .obj.

В какой-то момент вы смотрите на следующую строку.

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

Итак, какие имена идентификаторов вы бы использовали для частей?

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

Позвольте мне дать несколько ответов, чтобы вы начали.

А) базовое имя?

Б) имя файла? Или это имя файла? Разница важна при выборе имен идентификаторов, и я здесь никогда не согласен.

В) расширение

D) Расширение. Подождите, это то, что я назвал C. Должен ли я избегать хранения точки, и просто вставлять в случае необходимости? Что если в конкретном файле нет точки?

H) путь? Или подождите, это просто путь?

Я) имя файла. Подождите, это то, что я назвал C. Путь. Подождите, это то, что я назвал H. Может быть, H должно быть имя папки. Разве «папка» не является специфичным для Windows термином?

Oddthinking
источник
Майк Поуп, технический редактор Microsoft, отмечает в своем блоге, что , хотя руководство по стилю Microsoft последовательно придерживается двух слов: имени файла, имени папки, имени тома, в руководство по стилю Apple иногда включаются: имя файла, путь, имя тома ,
Странное мышление
A) определенно не следует называть basename, потому что basename уже используется во многих местах для обозначения последнего элемента в пути (для файла это будет имя файла без dirpath). Некоторые места называют имя файла без расширения stem.
wisbucky
Кроме того, для файлов с несколькими периодами (например, foo.src.txt), существует ли какой-либо стандартный способ определения (и именования) расширения / s?
user117529

Ответы:

178

Я думаю, что ваш поиск «стандартного» соглашения об именах будет напрасным. Вот мои предложения, основанные на существующих, известных программах:

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

Vim называет это корнем файла (: help filename-modifiers)

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

имя файла или базовое имя

C) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo. SRC (без точки)

расширение файла / имени

D) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo .src (с точкой)

также расширение файла . Просто сохраните без точки, если в файле нет точки, она не имеет расширения

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

top of tree
Нет соглашения, git называет его базовым каталогом

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

путь от вершины дерева до листа
относительный путь

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

один узел дерева
нет соглашения, может быть, простой каталог

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

имя режиссера

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

полный / абсолютный путь

blinry
источник
8
Это становится не по теме, но будьте осторожны с хранением расширения отдельно от точки. Вам нужно обрабатывать имена файлов "foo", "foo". и "foo.txt" (и даже "foo.txt.bak".)
странное мышление
1
Привет, ребята, отличный пример. Было бы легче читать, если бы вы поставили ответ рядом с вопросом, вместо того чтобы использовать ссылки, которые заставляют прокручиваться вверх. Кстати, я делаю правку, чтобы улучшить это. Греттингс
Виктор
3
Виктор, так как твое редактирование было отклонено (ребята, это очень хорошее улучшение!) Я просто сделал это сам :-)
blinry
1
Что касается 1.(имя файла только без расширения), я решил пойти на File Titleэто давно из-за отсутствия четкого соглашения или хотя бы глобального консенсуса.
Polyvertex
1
Для A(имя файла без расширения), вы можете использовать stem. Ссылки: 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
36

Хороший вопрос, прежде всего, мой +1. Эта вещь беспокоила меня, когда я однажды должен был создать множество функций в классе Utility. GetFileName? или GetFullName? GetApplicationPath означает полный путь или имя каталога? и так далее. Я родом из .NET, поэтому думаю, что могу добавить немного больше к отличному ответу @blinry.

Резюме: (курсивом я бы не стал программистом)

  1. Путь : Путь указывает уникальное местоположение в файловой системе (если только его относительный путь). Имя пути используется реже, но я бы придерживался пути - он в значительной степени объясняет, что это такое. Путь может указывать на файл или папку, или даже ничего (C: \). Путь может быть:

    1. Относительный путь : My Source\Widget\относительный путь, а также Widget\foo.src. Самоочевидно.
    2. Абсолютный путь или Полный путь : это полный путь, указывающий на цель. Я склонен использовать последнее чаще. C:\users\OddThinking\Documents\My Source\Widget\foo.srcследовательно, полный путь. Посмотрите в конце, что я называю полным путем, который указывает на файл и который заканчивается как каталог.

    Страницы вики и .NET именование для пути непротиворечивы.

  2. Корневой путь или корневой каталог . Бывший является соглашением .NET, в то время как последний более известен в кругах UNIX. Хотя мне нравятся оба, я склонен использовать первое больше. В Windows, в отличие от UNIX, есть много разных корневых путей, по одному для каждого раздела. Unix-системы имеют один корневой каталог, который содержит информацию о других каталогах и файлах. Например. C:\это корневой путь.

  3. Имя папки или папки : Widgetи OddThinkingт. Д. В вашем случае. Это может быть соглашение только для Windows (на самом деле это мое собственное странное мышление :)), тем не менее я категорически не согласен с ответом Блинри «Каталог». Хотя для обычного пользовательского каталога означает то же самое, что и папка (например, подпапки, подкаталоги), я считаю, что с технической точки зрения «каталог» должен звучать как полный адрес цели, а не самой цели. Подробнее ниже.

    1. Подпапки : В отношении users OddThinkingи Documentsявляются подпапками.
    2. Подкаталоги : Что касается users OddThinking\, OddThinking\Documents\и OddThinking\Documents\My Source\Widget\являются подкаталогами. Но нам не нужно беспокоиться об этом, не так ли?
    3. Дочерняя папка : относительно users OddThinkingдочерней папки (а также подпапки)
    4. Родительская папка : For OddThinking users- это ее родительская папка (просто упоминание различных терминов, ничего страшного).
  4. Каталог или Имя каталога : первый обычно используется в реальной жизни, второй - в коде. Это относится к полному пути (или просто полному пути ) до родительской папки цели . В вашем случае C:\users\OddThinking\Documents\My Source\Widget(Да, каталог никогда не должен указывать на файл). Я использую имя каталога в своем коде, так как каталог - это класс в .NET, а имя каталога - это то, что сама библиотека называет его. Это вполне соответствует dirname, используемому в системах UNIX.

  5. Имя файла или базовое имя: имя файла вместе с расширением. В вашем случае: foo.src. Я бы сказал, что для нетехнического использования я предпочитаю имя файла (это то, что оно означает для конечного пользователя), но в технических целях я бы строго придерживался базового имени . Имя файла часто используется MS, но я удивлен, как они не согласованы не только в документации, но даже в библиотеке . Там имя файла может означать либо базовое имя, либо полный путь к файлу. Так что я предпочитаю базовое имя, это то, что я называю их в коде. Эта страница в вики также говорит, что имя файла может означать либо полный путь, либо базовое имя. Удивительно, но даже в .NET я могу найти использование базового имени для обозначения корневого имени файла.

  6. Расширение или файла расширение или расширение файла : Я , как последний. Все относится к одному и тому же, но что это опять вопрос спора! Вики говорят, что в srcто время я помню, что читал, что многие языки интерпретируют это как .src. Обратите внимание на точку. Итак, еще раз мое мнение, для случайного использования не имеет значения, что это такое, но как программист я всегда вижу расширение как.src .

    Хорошо, я мог попытаться получить некоторые стандартные правила, но вот два из моих соглашений, которым я следую. И это о полных путях.

    1. Я обычно называю полный путь, который указывает на файл как путь к файлу . Для меня путь к файлу является четким, он говорит мне, что это такое. Хотя с именем файла я нахожу его как имя файла, в своем коде я называю его именем файла . Это также согласуется с « именем каталога ». С технической стороны имя относится к полностью квалифицированному имени! Разочаровывающе .NET использует термин имя файла (поэтому у меня есть мой случай здесь) и иногда путь к файлу для этого.

    2. Я называю полный путь, который заканчивается как каталог каталогом. На самом деле любой адрес, который не указывает на файл, можно назвать каталогом. Таков C:\users\OddThinking\Documents\My Source\каталог, C:\users\OddThinking\каталог или даже OddThinking\Documents\My Source\(лучше назвать его подкаталогом или даже лучше относительный путь - все, что зависит от контекста, с которым вы работаете). Выше я упомянул что-то другое о каталоге, который является именем каталога. Вот мое мнение: я найду новый путь, чтобы избежать путаницы. Что это D:\Fruit\Apple\Pip\? Каталог. Но если вопрос в том, каков каталог или даже лучше имя каталога D:\Fruit\Apple\Pip\, ответ таков D:\Fruit\Apple\. Надеюсь, это ясно.

    Я бы сказал, что лучше не беспокоиться о последних двух терминах, поскольку именно это создает наибольшую путаницу (лично для меня). Просто используйте термин полный путь !

Чтобы ответить вам:

  1. по отношению к пути, который вы дали

    А) Понятия не имею. В любом случае, мне никогда не нужно было оставлять его одного.

    Б) базовое имя

    C) Я бы просто назвал это расширением файла на данный момент, я меньше всего волнуюсь, так как мне никогда не нужно было, чтобы одно это было указано в моем коде.

    Г) расширение файла обязательно.

    E) Я не думаю, что это требование общего назначения. Без понятия. В .NET базовый каталог совпадает с именем каталога.

    F) относительный путь

    Г) папка (родительская папка с базовым именем foo.src)

    H) имя каталога

    I) полный путь (или даже имя файла)

  2. в общем (извините за то, что я немного многословен, просто чтобы понять суть), но предположим, что foo.srcэто действительно файл

    А) нет

    Б) базовое имя

    В) нет данных

    Г) расширение

    E) каталог или просто путь

    F) относительный путь

    Г) нет

    H) каталог или просто путь

    I) полный путь (или даже имя файла)

Далее вождение с одним примером с моей стороны:

  1. Рассмотрим путь C:\Documents and Settings\All Users\Application Data\s.sql.

    1. C:\Documents and Settings\All Users\Application Data\s.sql полный путь (который является именем файла)
    2. C:\Documents and Settings\All Users\Application Data\ это имя каталога.
  2. Теперь рассмотрим путь C:\Documents and Settings\All Users\Application Data

    1. C:\Documents and Settings\All Users\Application Data полный путь (который является каталогом)
    2. C:\Documents and Settings\All Users это имя каталога.

Две мои подсказки:

  1. Я придерживаюсь этого практического правила: когда дело доходит до адресации полного адреса независимо от его типа, я почти всегда называю его «полным путем». Это не только исключает использование двух терминов для пути к файлу и пути к папке, но также позволяет избежать путаницы, если вы собираетесь назвать этот файл как имя файла (что для большинства пользователей сразу переводится как basename). Но да, если вам нужно определиться с типом пути, лучше назвать его, чем имя файла или каталог, а не более общий «путь».

  2. Что бы это ни было, вы должны иметь в виду свою собственную идею, быть последовательной с ней во всем. Есть согласие среди членов команды, что это означает это, а не это.

Теперь, когда у меня есть круг, у меня есть практика. Новый бренд терминов будет то, что используется на OS X и Android-машинах. И все это только о физических путях в файловой системе. В случае веб-адресов возникнет целый новый набор терминов. Я ожидаю, что кто-то заполнит пустоту в этой же теме :) Я был бы рад услышать соглашение, с которым вы продвинулись ..

Навфал
источник
Долгое время я использовал слово «путь» для обозначения полного абсолютного пути, включая полное имя файла. Ваш ответ, другие здесь и ресурсы в других местах изменили мое мнение об этом, и теперь я буду использовать слово «полный путь» для этого, «путь» для местоположения без имени файла и «имя файла» или «имя» для имени файла сам.
Nate
24

В C ++ Boost.Filesystem разработала номенклатуру для различных частей пути. Подробности смотрите в справочной документации по разложению пути , а также в этом руководстве. .

Вот резюме на основе учебника. Для:

  • Путь Windows: c:\foo\bar\baa.txt
  • Путь Unix: /foo/bar/baa.txt

ты получаешь:

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

Стандарт C ++ ISO / IEC 14882: 2017

Более того, терминология Boost.Filesystem была принята C ++ 17 => См.std::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
Эмиль Кормье
источник
6
Как они тогда называют все это? path, fullpath?
wisbucky
@wisbucky Все это называется "путь" в их номенклатуре.
Эмиль Кормье
1
@wisbucky Исправлена ​​ссылка. Спасибо.
Эмиль Кормье
@olibre: Спасибо за обновление C ++ 17. Но stem()это часть имени файла , а не путь .
Эмиль Кормье
1
@ johnc.j. Жаль, что Boost.Filesystem не была так хорошо известна, когда вопрос был задан впервые. Я предпочел бы принять номенклатуру рецензируемой библиотеки, чем придумывать что-то самостоятельно.
Эмиль Корниер
9

pathlibСтандартная библиотека Python имеет отличное соглашение об именах для компонентов пути: https://docs.python.org/3/library/pathlib.html

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

стебель

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

название

c) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo. SRC (без точки)

[ничего]

г) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo .src (с точкой)

суффикс

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

путь прародителя

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

относительный путь к прародителю

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

имя родителя

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

родительский путь

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

дорожка

Maggyero
источник
8

Нет, ты не сумасшедший.

В системах Windows иногда путь к каталогу, содержащему файл , называется путем , который был с самого начала. Так, например,

    x:\dir1\dir2\myfile.txt

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

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

Подход Unix / Linux намного более логичен, и это то, что все упоминали выше: путь, включая само имя файла. Однако, если вы наберете "call /?" в командной строке Windows вы получите это:

    %~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

Таким образом, это «только путь» и «только имя файла». В то же время они ссылаются на всю строку как «полное имя пути», которое понимается как буква диска плюс путь плюс имя файла. Так что нет настоящей правды. Это бесполезно. Вы были преданы.

Тем не мение,

Ответить на ваш вопрос

Вот как бы я назвал ваши примеры:

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

У ADEF нет простых ников. И поскольку php, вероятно, является наиболее широко известным кроссплатформенным языком, все понимают «базовое имя» и «dirname», поэтому я буду придерживаться этого названия. Полное имя также очевидно; Полный путь будет немного двусмысленным, но в большинстве случаев это означает одно и то же.

dkellner
источник
1
Долгое время я использовал слово «путь» для обозначения полного абсолютного пути, включая полное имя файла. Другие ответы здесь и ресурсы в других местах изменили мое мнение об этом, и теперь я буду использовать слово «полный путь» для этого, «путь» для местоположения без имени файла и «имя файла» или «имя» для самого имени файла.
Nate