Jaki jest termin techniczny dla katalogu bieżącego (.) I nadrzędnego (..)?

20

Mam funkcję, która sprawdza, czy nazwa przekazanego pliku to .lub ... Ale nie wiem, jak właściwie to nazwać. Coś takiego IsCurrentOrParentDirectory()jest niejednoznaczne, ponieważ funkcja przyjmuje nazwę pliku, a nie pełną ścieżkę. (Intuicyjnie inny programista spodziewałby się, że przejdzie, /usr/kiedy ja /usr/wrócę true, choć tak nie jest.)

Czy istnieje termin techniczny dla tych pozycji katalogu? Jeśli istnieje, co to jest?

Max Truxa
źródło
1
. i .. wcale NIE są nazwami plików, ale folderami. Dlaczego po prostu nie sprawdzisz, czy dane wejściowe są poprawnymi plikami (typ według stat () to IF_REG)? PS Prawdopodobnie jest to bardziej odpowiednie dla StackOverflow
Tonny
7
@ Tonny .i .. nazwami plików zgodnymi ze standardem POSIX. Zobacz mój cytat poniżej. Powiedziałbym, że tutaj jest dobrze, ponieważ dotyczy ogólnych pojęć komputerowych.
slhck
Muszę przyznać, że moje sformułowanie znów było dwuznaczne. Funkcja pobiera pojedynczy plik lub nazwę katalogu ( foo.bar, foo...), ale nie ścieżkę ( foo/bar, /foo/...). Ale ponieważ katalogi, łącza itp. Również są plikami, zostawię to w ten sposób.
Max Truxa,
@slhck POSIX nazywa go plikiem, ale robi to dla KAŻDEGO obiektu systemu plików. Plik w terminologii POSIX należy zwykle odczytywać jako skrót od „obiektu systemu plików”. Na początku Uniksa i wyprowadza wszystkie pliki FSO, w których tak naprawdę są pliki, ale nie jest to prawdą w przypadku niektórych nowoczesnych implementacji i na pewno nie w przypadku systemów operacyjnych innych niż Unix, ale zgodne z POSIX (Windows NT jako najbardziej oczywisty przykład). - Prawdopodobnie powinienem napisać w moim komentarzu „zwykły plik” zamiast „prawidłowy plik”, ale komentarz Maxa Truxa i tak sprawia, że ​​jest to kwestia sporna.
Tonny,

Odpowiedzi:

23

Ze standardu POSIX :

Specjalna kropka nazwy pliku powinna odnosić się do katalogu określonego przez swojego poprzednika. Kropka-kropka w specjalnej nazwie pliku odnosi się do katalogu nadrzędnego swojego katalogu poprzednika. Jako szczególny przypadek w katalogu głównym kropka-kropka może odnosić się do samego katalogu głównego.

Tak naprawdę, jeśli chcesz sprawdzić, czy nazwa pliku jest, .czy ..musisz ją wywołać IsDotOrDotDot(), albo używając terminologii POSIX do rozwiązywania nazw ścieżek IsPredecessorOrParentOfPredecessor(), a może nawet PointsToPredecessorOrParentOfPrecedessor()… masz pomysł. Problem polega na tym, że ta ostatnia terminologia ma sens tylko w przypadku patrzenia na pełne ścieżki. Ale i tak nikt tego nie zrozumie.

Biorąc to pod uwagę .i ..są to prawidłowe nazwy plików (po prostu interpretowane inaczej), powinieneś trzymać się tego, co masz, opierając się na znaczeniu, a nie na tym, jak są one nazywane wewnętrznie.

slhck
źródło
Jest .bash_historykropką czy nie kropką? Nie jestem pewien, czy nazwa tej funkcji jest bardziej opisowa niż otwarta propozycja OP.
Jens Erat,
@JensErat To nie ma znaczenia dla problemu. Pytanie brzmiało, czy składnik nazwa pliku była .albo ..i nie, czy to po prostu zaczęło się .. Oczywiście nazwa funkcji OP jest bardziej opisowa; Właśnie wskazałem mu, jak to technicznie się nazywa.
slhck,
2
Jasne, że tak, ale w IsDotOrDotDot()zasadzie nic nie mówi o tym, co ta funkcja robi.
Jens Erat,
„poprzednik” odnosi się do elementu ścieżki bezpośrednio przed nim w specyfikacji ścieżki. Jeśli patrzysz tylko na nazwy wpisów w katalogu, lepsza terminologia to „bieżący” lub „nadrzędny”.
Simon Richter,
2
@JensErat Chciałbym użyć IsDotOrDotDot. Każdy, kto zna się na koncepcjach systemów plików, natychmiast to zrozumie. Można dyskutować, czy .bash_historyjest to „kropka”, ponieważ nie podano kontekstu dla znaczenia „kropka”, ale zdecydowanie NIE jest to „kropka lub kropka”.
kinokijuf
4

.i ..są zwykle używane do opisania ścieżek względnych w porównaniu z absolutnymi /usr. Użyłbym tej różnicy i zadeklarowałbym funkcję jako IsRelativeCurrentOrParentDirectory().

Pamiętaj, że odniesienia do kropek mogą występować w dowolnym miejscu na ścieżce. Co /usr/local/..?

Jens Erat
źródło
Nie zauważyłem, że funkcja przyjmuje tylko nazwę pliku, a nie pełną ścieżkę. Odpowiednio zaktualizowałem pytanie.
Max Truxa,
2

Standard POSIX, który slhck ♦ użytecznie zacytował, mówi:

Specjalna kropka nazwy pliku powinna odnosić się do…  Kropka-kropka w specjalnej nazwie pliku odnosi się do…

(podkreślenie dodane). Chociaż nie jest to do końca techniczne , wygląda na to, że „specjalna nazwa pliku” może być oficjalną nazwą. Użytkownicy prawdopodobnie zrozumieć, jeśli nazywa czynność którekolwiek z poniższych kryteriów: IsSpecialDirectory(), IsSpecialFilename()lub po prostu IsSpecialName().

Albo można iść z IsStandardDirectory(), IsStandardFilename()lub IsStandardName(). Jest to zgodne z konwencją nazewnictwa uniksowego (standardowe wejście, standardowe wyjście) dla rzeczy, które są ustalane automatycznie (w tym przypadku przez mkfsi mkdir).  IsAutomatic…()lub IsDefault…()z drugiej strony prawdopodobnie nie są wystarczająco intuicyjne.

Scott
źródło
Właściwie pierwsze imię, które przyjąłem, było IsMagicDirectory()bardzo zbliżone do tego, ale myślę, że twoje sformułowanie jest o wiele bardziej intuicyjne i odpowiednie (zwłaszcza, że ​​używa ustalonych konwencji nazewnictwa). Użycie IsSpecialFileNamespowoduje nawet, że funkcja nie otrzyma ścieżki, ale nazwę pojedynczego pliku (lub katalogu, łącza itp.).
Max Truxa
Dobry pomysł. „Specjalne” prawdopodobnie zawierałyby jednak również linki, FIFO itp., Prawda?
slhck
@slhck: Tak, urządzenia (np. dyski i tty) nazywane są „plikami specjalnymi”. I tak, termin ten może być luźno stosowany do dowiązań symbolicznych, FIFO i innych egzotycznych użytkowników systemu plików - dowolnego typu pliku (i-węzła) innego niż „zwykły plik”. (Tak, katalogi również mieszczą się w tym segmencie.) To IsSpecialFile()byłaby zła sugestia. Ale nie zasugerowałem tego; I zasugerował IsSpecialFilename(). Choć nazwy sda1, console, kmem, myfifoi urandomsugerują, że nie są zastrzeżone i nie są z natury wyjątkowy. Ale .i ..są z natury specjalnymi nazwami plików .
Scott
1

Jedynym znanym mi terminem ze świata * nix jest CWDbieżący katalog roboczy. To jest dość często używane. Zobacz na przykład /proc/$$/cwdlink do katalogu, z którego uruchomiono polecenie.

Nie znam żadnej standardowej nazwy ..oprócz dot-doti jak zauważył @slhck, nie jest to dobry wybór.

terdon
źródło
0

Posix jest dość dwuznaczny, mówiąc o relacjach katalogu rodzic-dziecko. Jak powiedzieli inni, ./ ..nie jest pomocny podczas rozmowy lub komunikacji z innymi ludźmi.

Struktury plików można traktować jako strukturę danych drzewa. Tutaj ogólnie „rodzic” i „dziecko” lub „córka” są wystarczające do przekazania znaczenia. Zobaczysz, że podręczniki struktury danych noszą tę konwencję

Alternatywnie wydaje się, że drzewa można mówić o „drzewie w górę” i „w dół”. Zgodnie z konwencją „góra” oznacza bliżej katalogu głównego, a „dół” odnosi się do dziecka (dzieci).

Myślę, że albo można, IsCurrentOrUp()albo IsCurrentOrParent()można uznać, dobrą praktykę w zakresie nazewnictwa funkcji.

CodeOcelot
źródło