19

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

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

5 ответов5

23

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

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

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

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

4

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

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

2

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

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

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

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

1

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

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

0

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .