Имя файла? Имя пути? Базовое имя? Стандарт именования для кусочков дорожки - PullRequest
192 голосов
/ 10 февраля 2010

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

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

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

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

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

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

Ответы [ 4 ]

140 голосов
/ 10 февраля 2010

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

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 \ Widget \ foo.src

верхушка дерева
Git называет это base directory

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

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

32 голосов
/ 08 марта 2012

Хороший вопрос, прежде всего, мой +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. Root Path или Root Directory : бывший .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. Родительская папка : Для OddThinking users является ее родительской папкой (просто упоминание различных терминологий, ничего страшного).
  4. Каталог или Имя каталога : первый обычно используется в реальной жизни, второй - в коде. Это относится к полному пути (или просто полный путь ) до родительской папки цели . В вашем случае, C:\users\OddThinking\Documents\My Source\Widget (Да, каталог никогда не должен указывать на файл). Я использую имя каталога в своем коде, так как каталог - это класс в .NET, а имя каталога - это то, что сама библиотека называет его. Это вполне соответствует dirname , используемому в системах UNIX.

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

  6. расширение или расширение имени файла или расширение файла : мне нравится последнее. Все относится к одному и тому же, но что это опять вопрос дискуссии! Wiki говорит, что это 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. относительно пути, который вы указали

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

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

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

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

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

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

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

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

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

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

    А) НС

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

    C) NA

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

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

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

    G) NA

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

22 голосов
/ 29 октября 2014

В 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 голосов
/ 09 июня 2017

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

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

    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

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

...