Имя файла? Имя пути? Базовое имя? Именование стандарта для фрагментов пути
Я продолжаю зацикливаться на манипуляциях с путями и именами файлов, потому что у меня нет общей системы именования, которую я использую.
Мне нужно придумать стандарт именования и придерживаться его, и я хотел бы быть ясным и последовательным с другими, поэтому я открываюсь, чтобы выучить канонические ответы.
Рассмотрим эту игрушечную проблему: (пример 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) полный путь (или даже имя файла)
Дальнейшее движение с одним примером с моей стороны:
Две мои рекомендации:
-
Я следую этому эмпирическому правилу, что, когда дело касается адресации полного адреса, независимо от его типа, я почти всегда называю его "полным путем". Это не только устраняет использование двух терминов для пути к файлу и пути к папке, но также позволяет избежать путаницы, если вы назовете имя файла как имя файла (которое для большинства пользователей сразу переводит на базовое имя). Но да, если вы должны быть конкретными в отношении типа пути, лучше назвать имя файла или каталог вместо более общего "пути".
-
Как бы то ни было, у вас будет своя собственная идея, будьте в согласии с ней повсюду. Согласитесь с членами команды, что это означает это, а не то.
Теперь, когда только из круга у меня есть практика. Новый бренд терминов будет тем, что используется на 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
дорожка