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

3286
Max Truxa

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

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

19
, и .. это НЕ имена файлов, а папки. Почему бы вам просто не проверить, является ли ввод допустимым файлом (тип согласно stat () - IF_REG)? PS Это, вероятно, больше подходит для StackOverflow Tonny 10 лет назад 1
@Tonny `.` и` ..` * - это * имена файлов в соответствии со стандартом POSIX. Смотрите мою цитату ниже. Я бы сказал, что здесь все хорошо, поскольку речь идет об общих компьютерных концепциях. slhck 10 лет назад 7
Я должен признать, что моя формулировка снова была неоднозначной. Функция принимает одно имя файла или каталога (`foo.bar`,` foo`, ...), но не путь (`foo / bar`,` / foo / `, ...). Но так как каталоги, ссылки и т. Д. Тоже файлы, я оставлю это так. Max Truxa 10 лет назад 0
@slhck POSIX называет это файлом, но делает это для ЛЮБОГО объекта файловой системы. Файл в терминологии POSIX обычно следует читать как аббревиатуру «объекта файловой системы». В ранних версиях Unix он выводит все FSO, где действительно находятся файлы, но это не так для некоторых современных реализаций и, конечно, не для не-Unix, но для POSIX-совместимых операционных систем (Windows NT как наиболее очевидный пример). - Мне, вероятно, следовало бы написать «обычный файл» вместо «действительный файл» в моем комментарии, но комментарий Макса Трукса в любом случае делает его спорным. Tonny 10 лет назад 0

5 ответов на вопрос

23
slhck

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

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

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

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

Является ли `.bash_history` точечным или не точечным? Я не уверен, является ли это имя функции более описательным, чем открытое предложенное OP. Jens Erat 10 лет назад 0
@JensErat Это не имеет отношения к проблеме. Вопрос был в том, был ли компонент имени файла `.` или` ..`, а не в том, начинался ли он только с `.`. Конечно, имя функции OP более наглядно; Я просто указывал ему, как это технически называется. slhck 10 лет назад 0
Конечно, это так, но `IsDotOrDotDot ()` практически ничего не говорит о том, что функция делает вообще. Jens Erat 10 лет назад 2
«Предшественник» относится к элементу пути непосредственно перед ним в спецификации пути. Если вы просто просматриваете имена записей в каталоге, термины «текущий» или «родительский» лучше подходят. Simon Richter 10 лет назад 0
@JensErat Я бы использовал `IsDotOrDotDot`. Любой, кто знаком с понятиями файловой системы, сразу же поймет это. Это спорно, является ли `.bash_history` является«точка», потому что контекст не предусмотрено, то для значения«точки», но это определенно не«точка или точка точка». kinokijuf 10 лет назад 2
@JensErat Быстрая проверка: Вы читаете это так же, как я был на мгновение? IsDotOrDotDot не является IsDotOrNotDot. Во-вторых, я согласен, я ожидал, что это будет верно для точечных файлов. Во-первых, _if_ Я читаю буквы, как они есть, это имеет смысл. Тем не менее, мне очень не нравится повторение в названии ... Izkata 10 лет назад 0
Почему бы не две функции для улучшения читабельности? `IsDot ()` и `IsDotDot ()`. Плюс тогда вы можете проверить специально для одного или другого, если вам нужно. Kai 10 лет назад 0
4
Jens Erat

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

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

Я не смог указать, что функция принимает только имя файла, а не полный путь. Я обновил вопрос соответственно. Max Truxa 10 лет назад 0
2
Scott

The POSIX Standard, which slhck♦ usefully quoted, says,

The special filename dot shall refer to ….  The special filename dot-dot shall refer to ….

(emphasis added).  So, while it’s not exactly technical, it looks like “special filename” just might be the official name.  Your users would probably understand it if you called your function any of the following: IsSpecialDirectory(), IsSpecialFilename(), or simply IsSpecialName().

Or you could go with IsStandardDirectory(), IsStandardFilename(), or IsStandardName().  This follows the Unix naming convention (standard input, standard output) for things that are established for you automatically (in this case, by mkfs and mkdir).  IsAutomatic…() or IsDefault…(), on the other hand, probably are not intuitive enough.

На самом деле первое имя, которое я взял, было `IsMagicDirectory () ', так что это довольно близко к этому, но я думаю, что ваша формулировка намного более интуитивна и уместна (особенно потому, что она использует установленные соглашения об именах). Использование `IsSpecialFileName` даже даст понять, что функция получает не путь, а имя одного файла (или каталога, ссылки и т. Д.). Max Truxa 10 лет назад 0
Хорошее предложение. «Специальный», однако, также может включать ссылки, FIFO и т. Д., Верно? slhck 10 лет назад 0
@slhck: Да, устройства (например, диски и ttys) называются «специальными файлами». И, да, этот термин можно свободно применять к символическим ссылкам, FIFO и другим экзотическим объектам файловой системы - к любому типу файлов (i-node), кроме «обычного файла». (Да, каталоги тоже попадают в эту корзину.) Поэтому `IsSpecialFile ()` было бы плохим предложением. Но я не предложил это; Я предложил `IsSpecialFilename ()`. Хотя имена `sda1`,` console`, `kmem`,` myfifo` и `urandom` носят многозначительный характер, они не являются зарезервированными и не являются специальными. Но `.` и` ..` - это особые *** имена файлов ***. Scott 10 лет назад 0
1
terdon

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

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

0
CodeOcelot

Posix is pretty ambiguous on speaking about parent-child directory relationships. As others have said, ./.. isn't helpful while talking or communicating with other humans.

File structures can be thought about as a tree data structure. Here, generally "parent" and "child" or "daughter" are sufficient to convey meaning. You'll see data structure textbooks carry this convention

Alternatively, it seems like trees can be talked about as "up" and "down" the tree. By convention, "up" means closer to the root directory, and "down" refers to the child(ren).

I think either IsCurrentOrUp() or IsCurrentOrParent() can be argued to be good practice for naming functions.