Каков технический термин для текущего (.) И родительского (..) каталога?


20

Я получил функцию, которая проверяет, является ли переданное имя файла .или ... Но я не знаю, как правильно назвать это. Нечто подобное IsCurrentOrParentDirectory()неоднозначно, поскольку функция принимает имя файла, а не полный путь. (Интуитивно приятель-программист ожидал бы, что /usr/я уйду, а я /usr/вернусь true, хотя на самом деле это не так.)

Есть ли технический термин для этих записей каталога? Если есть, что это?


1
, и .. это НЕ имена файлов, а папки. Почему бы вам просто не проверить, является ли ввод допустимым файлом (тип согласно stat () - IF_REG)? PS Это, вероятно, больше подходит для StackOverflow
Тонни

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

Я должен признать, что моя формулировка снова была неоднозначной. Функция принимает один имя файла или каталога ( foo.bar, foo, ...) , но не путь ( foo/bar, /foo/, ...). Но так как каталоги, ссылки и т. Д. Тоже файлы, я оставлю это так.
Макс Трукса

@slhck POSIX называет это файлом, но делает это для ЛЮБОГО объекта файловой системы. Файл в терминологии POSIX обычно следует читать как аббревиатуру «объекта файловой системы». В ранних версиях Unix он выводит все FSO, где действительно находятся файлы, но это не так для некоторых современных реализаций и, конечно, не для не-Unix, но для POSIX-совместимых операционных систем (Windows NT как наиболее очевидный пример). - Мне, вероятно, следовало бы написать «обычный файл» вместо «действительный файл» в моем комментарии, но комментарий Макса Трукса в любом случае делает его спорным.
Тонни

Ответы:


23

Из стандарта POSIX :

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

Так что, на самом деле, если вы хотите проверить, является ли имя файла, .или ..вам придется его вызывать IsDotOrDotDot(), или, используя терминологию POSIX по разрешению имен путей IsPredecessorOrParentOfPredecessor(), или, может быть, даже PointsToPredecessorOrParentOfPrecedessor()... вы поняли идею. Проблема в том, что последняя терминология имеет смысл только при просмотре полных путей. Но никто не поймет этого в любом случае.

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


Есть .bash_historyточка или нет дот? Я не уверен, является ли это имя функции более описательным, чем открытое предложенное OP.
Йенс Эрат

@JensErat Это не имеет отношения к проблеме. Вопрос состоял в том, был ли компонент имени файла .или ..нет, и только начинался ли он с .. Конечно, имя функции OP более наглядно; Я просто указывал ему, как это технически называется.
Slhck

2
Конечно, но IsDotOrDotDot()ничего не говорит о том, что функция делает вообще.
Йенс Эрат

«Предшественник» относится к элементу пути непосредственно перед ним в спецификации пути. Если вы просто просматриваете имена записей в каталоге, термины «текущий» или «родительский» лучше подходят.
Саймон Рихтер

2
@JensErat Я бы использовал IsDotOrDotDot. Любой, кто знаком с понятиями файловой системы, сразу же поймет это. Это спорно , является ли .bash_historyэто «точка» , потому что контекст не предусмотрен , то для значения «точки», но это определенно не «точка или точка точки».
киноюф

4

.и ..обычно используются для описания относительных путей против абсолютных, как /usr. Я бы использовал эту разницу и объявил бы функцию как IsRelativeCurrentOrParentDirectory().

Помните, что точечные ссылки могут встречаться в любом месте пути. Как насчет /usr/local/..?


Я не смог указать, что функция принимает только имя файла, а не полный путь. Я обновил вопрос соответственно.
Макс Трукса

2

Стандарт POSIX, который slhck ♦ полезно цитирует, говорит:

Специальная точка имени файла должна указывать на….  Специальное имя файла точка-точка должно ссылаться на….

(выделение добавлено). Так что, хотя это не совсем техническая информация , похоже, что «специальное имя файла» может быть официальным названием. Ваши пользователи, вероятно , понять это , если вы назвали вашу функцию любого из следующих условий : IsSpecialDirectory(), IsSpecialFilename()или просто IsSpecialName().

Или вы могли бы пойти с IsStandardDirectory(), IsStandardFilename()или IsStandardName(). Это соответствует соглашению об именах Unix (стандартный ввод, стандартный вывод) для вещей, которые устанавливаются для вас автоматически (в данном случае, с помощью mkfsи mkdir).  IsAutomatic…()или IsDefault…(), с другой стороны, возможно, недостаточно интуитивен.


На самом деле первое имя, которое я взял, было IsMagicDirectory()таким, что оно довольно близко к этому, но я думаю, что ваша формулировка намного более интуитивна и уместна (особенно потому, что она использует установленные соглашения об именах). Использование IsSpecialFileNameдаже даст понять, что функция получает не путь, а имя одного файла (или каталога, ссылки и т. Д.).
Макс Трукса

Хорошее предложение. «Специальный», однако, также может включать ссылки, FIFO и т. Д., Верно?
Slhck

@slhck: Да, устройства (например, диски и ttys) называются «специальными файлами». И, да, этот термин можно свободно применять к символическим ссылкам, FIFO и другим экзотическим объектам файловой системы - к любому типу файлов (i-node), кроме «обычного файла». (Да, каталоги тоже попадают в это ведро.) Так IsSpecialFile()что это было бы плохим предложением. Но я не предложил это; Я предложил IsSpecialFilename(). В то время как имена sda1, console, kmem, myfifoи urandomнаводят, они не защищены и не являются по своей сути особенные. Но .и ..по сути являются специальными именами файлов .
Скотт

1

Единственный термин, который я знаю из мира * nix, относится CWDк текущему рабочему каталогу. Это на самом деле довольно часто используется. Смотрите, например /proc/$$/cwd, ссылку на каталог, из которого вы запускаете команду.

Я не знаю ни одного стандартного названия для ..кроме, dot-dotи, как указал @slhck, это не очень хороший выбор.


0

Posix довольно двусмысленно говорит о взаимоотношениях каталогов родитель-потомок. Как уже говорили другие, ./ ..не помогает во время разговора или общения с другими людьми.

Файловые структуры можно рассматривать как древовидную структуру данных. Здесь, как правило, «родитель» и «ребенок» или «дочь» достаточно, чтобы передать смысл. Вы увидите, что учебники по структуре данных несут это соглашение

С другой стороны, кажется, что о деревьях можно говорить как о «вверх» и «вниз» дерева. По соглашению, «вверх» означает ближе к корневому каталогу, а «вниз» относится к дочернему (ren).

Я думаю, что IsCurrentOrUp()или IsCurrentOrParent()можно утверждать, что это хорошая практика для именования функций.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.