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

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

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

Рассмотрим эту игрушечную проблему: (пример 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

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

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

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

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

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

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

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

Ответ 1

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

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

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

B) 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\ Виджет \foo.src

вершина дерева
Нет соглашения, git вызывает его базовый каталог

F) C:\users\OddThinking\Documents\My Source\ Виджет \foo.src

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

G) C:\users\OddThinking\Documents\My Source\ Виджет\foo.src

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

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

имя dir

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

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

Ответ 2

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

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

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

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

    Страница wiki и имя .NET для пути согласовано.

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

  • Папка или Имя папки: Widget, OddThinking и т.д. в вашем случае. Это может быть конвенция Windows (на самом деле это мое собственное странное мышление:)), тем не менее я категорически возражаю против ответа "Справочника". Хотя для обычного каталога пользователя означает тот же самый, что и папка (например, вложенные папки, подкаталоги), я считаю, что технический угол "каталог" должен звучать как квалифицированный адрес для цели, а не самой цели. Еще ниже.

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

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

  • Расширение или Расширение имени файла или Расширение файла. Мне нравится последний. Все относится к одной и той же вещи, но что это еще вопрос дебатов! Wiki говорит, что это src, а затем я помню, как читал, что многие языки интерпретируют его как .src. Обратите внимание на точку. Итак, еще раз мой прием - для случайных целей, неважно, что это такое, но как программист, я всегда вижу расширение как .src.

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

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

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

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

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

  • относительно пути, который вы указали

    A) Не знаю. В любом случае мне никогда не понадобилось, чтобы он был один.

    B) basename

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

    D).

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

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

    G) (родительская папка в basename foo.src)

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

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

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

    A) NA

    B) basename

    C) NA

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

    E) или просто путь

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

    G) NA

    H) или просто путь

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

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

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

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

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

Две мои рекомендации:

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

  • Как бы то ни было, у вас будет своя собственная идея, будьте в согласии с ней повсюду. Согласитесь с членами команды, что это означает это, а не то.

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

Ответ 3

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

Здесь приведено резюме на основе учебника. Для:

  • Путь к 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

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

Кроме того, терминология Boost.Filesystem была принята С++ 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

Ответ 4

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

В системах 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, вероятно, является наиболее широко известным кроссплатформенным языком, все понимают "basename" и "dirname", поэтому я бы придерживался этого названия. Полное имя также очевидно; Полный путь будет немного двусмысленным, но в большинстве случаев это означает одно и то же.

Ответ 5

Стандартная библиотека Python pathlib имеет отличное соглашение по именованию для компонентов пути: 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 (без точки)

[nothing]

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

суффикс

e) C:\users\OddThinking\Documents\My Source \ Виджет\foo.src

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

f) C:\users\OddThinking\Documents\My Source \Виджет\foo.src

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

g) C:\users\OddThinking\Documents\My Source \Виджет\ foo.src

имя родителя

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

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

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

дорожка