Nazwa pliku? Nazwa ścieżki? Nazwa bazowa? Standard nazewnictwa dla fragmentów ścieżki

228

Wciąż manipuluję ścieżkami i nazwami plików, ponieważ nie mam wspólnego systemu nazewnictwa, którego używam.

Muszę wymyślić standard nazewnictwa i trzymać się go, a ja chciałbym być jasny i spójny z innymi, więc otwieram się, aby poznać kanoniczne odpowiedzi.

Rozważ ten problem z zabawkami: (przykład systemu Windows, ale mam nadzieję, że odpowiedź powinna być niezależna od platformy)

Otrzymałeś pełną nazwę folderu: C: \ users \ OddThinking \ Documents \ My Source. Chcesz przejść foldery poniżej i skompilować wszystkie pliki .src do .obj.

W pewnym momencie patrzysz na następujący ciąg.

C:\users\OddThinking\Documents\My Source\Widget\foo.src

Jakich nazw identyfikatorów użyłbyś dla części?

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

Pozwól, że dam kilka odpowiedzi, aby zacząć.

A) nazwa podstawowa?

B) nazwa pliku? Czy to nazwa pliku? Różnica jest ważna przy wyborze nazw identyfikatorów i nigdy nie jestem tutaj konsekwentny.

C) Rozszerzenie

D) Rozszerzenie. Zaczekaj, tak nazywam C. Czy powinienem unikać przechowywania kropki i wkładać ją w razie potrzeby? Co jeśli nie ma kropki na określonym pliku?

H) nazwa ścieżki? A może poczekaj, czy to tylko ścieżka?

I) nazwa pliku. Czekaj, to właśnie nazwałem C. Path. Zaczekaj, to właśnie nazwałem H. Może H powinna być nazwą folderu. Czy „folder” nie jest terminem specyficznym dla systemu Windows?

Dziwne
źródło
Mike Pope, redaktor techniczny w firmie Microsoft, zauważa na swoim blogu, że chociaż przewodnik po stylu Microsoft konsekwentnie trzyma się dwóch słów: nazwa pliku, nazwa folderu, nazwa woluminu, Apple Style Guide czasami dołącza do nich: nazwa pliku, nazwa ścieżki, nazwa woluminu .
Dziwne
A) zdecydowanie nie powinno się nazywać basename, ponieważ basename jest już używany w wielu miejscach jako ostatni element ścieżki (dla pliku, która byłaby nazwą pliku bez dirpath). Niektóre miejsca nazywają nazwę pliku bez rozszerzenia stem.
wisbucky,
Czy w przypadku plików z wieloma kropkami (np. Foo.src.txt) istnieje jakiś standardowy sposób identyfikacji (i nazewnictwa) rozszerzenia / -ów?
user117529,

Odpowiedzi:

178

Myślę, że poszukiwanie „standardowej” konwencji nazewnictwa będzie daremne. Oto moje propozycje oparte na istniejących, dobrze znanych programach:

A) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo .src

Vim nazywa to rootem pliku (: help modyfikatory plików)

B) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

nazwa pliku lub nazwa podstawowa

C) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo. src (bez kropki)

rozszerzenie pliku / nazwy

D) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo .src (z kropką)

także rozszerzenie pliku . Po prostu przechowuj bez kropki, jeśli plik nie ma kropki, nie ma rozszerzenia

E) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

góra drzewa
Brak konwencji, git nazywa to katalogiem podstawowym

F) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

ścieżka od wierzchołka drzewa do
ścieżki względnej liścia

G) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

jeden węzeł drzewa
bez konwencji, może prosty katalog

H) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

reż

I) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

pełna / bezwzględna ścieżka

rumieniec
źródło
8
To robi się nie na temat, ale uważaj, aby przechowywać rozszerzenie oddzielnie od kropki. Musisz obsługiwać nazwy plików „foo”, „foo”. i „foo.txt” (a nawet „foo.txt.bak”.)
Dziwne,
1
cześć chłopaki, świetny przykład. Łatwiej byłoby przeczytać, jeśli umieścisz odpowiedź obok pytania, zamiast używać odniesień, które zmuszają do przewijania w górę. Nawiasem mówiąc, dokonuję edycji, aby to poprawić. Grettings
Victor
3
Wiktor, odkąd twoja edycja została odrzucona (chłopaki wtf, to bardzo dobra poprawa!) Właśnie to zrobiłem sam :-)
blinry
1
W przypadku 1.(nazwa pliku bez rozszerzenia) File Titlejuż dawno postanowiłem pójść z powodu braku jasnej konwencji lub przynajmniej globalnego konsensusu.
polyvertex,
1
Dla A(nazwa pliku bez rozszerzenia) możesz użyć stem. Odnośniki: doc.rust-lang.org/std/path/struct.Path.html#method.file_stem , llvm.org/docs/doxygen/html/… , boost.org/doc/libs/1_60_0/libs/filesystem/ doc /…
wisbucky 17.03.16
36

Dobre pytanie przede wszystkim, moje +1. Ta sprawa mnie zepsuła, gdy musiałem raz stworzyć mnóstwo funkcji w klasie Utility. GetFileName? lub GetFullName? GetApplicationPath oznacza pełną ścieżkę lub nazwę katalogu? i tak dalej. Pochodzę z platformy .NET, więc myślę, że mogę dodać trochę więcej do doskonałej odpowiedzi @blinry.

Podsumowanie: (Kursywą jest to, czego nie użyłbym jako programista)

  1. Ścieżka : Ścieżka określa unikalną lokalizację w systemie plików (chyba że jej ścieżka względna). Nazwa ścieżki jest rzadziej używana, ale trzymałbym się ścieżki - właściwie wyjaśnia, co to jest. Ścieżka może wskazywać plik lub folder, a nawet nic (C: \). Ścieżka może być:

    1. Ścieżka względna : My Source\Widget\jest także ścieżką względną Widget\foo.src. Wyjaśniające.
    2. Ścieżka bezwzględna lub pełna ścieżka : jest to w pełni kwalifikowana ścieżka, która wskazuje na cel. Często używam tego drugiego. C:\users\OddThinking\Documents\My Source\Widget\foo.srcjest stąd pełna ścieżka. Zobacz na końcu, co nazywam pełną ścieżką, która wskazuje na plik i kończy się na katalog.

    Strona wiki i nazwa .NET dla ścieżki są spójne.

  2. Root Path lub Root Directory : poprzednia konwencja .NET, podczas gdy ta ostatnia jest bardziej słyszalna w kręgach UNIX. Chociaż podoba mi się oba, częściej używam tego pierwszego. W systemie Windows, w przeciwieństwie do systemu UNIX, istnieje wiele różnych ścieżek katalogu głównego, po jednej dla każdej partycji. Systemy uniksowe mają jeden katalog główny, który zawiera informacje o innych katalogach i plikach. Na przykład. C:\jest ścieżka root.

  3. Folderu lub Nazwa folderu : Widget, OddThinkingitp w Twoim przypadku. Może to być konwencja tylko dla systemu Windows (w rzeczywistości jest to moje dziwne myślenie :)), jednak zdecydowanie sprzeciwiam się odpowiedzi Blinry'ego na „Directory”. Chociaż dla zwykłego katalogu użytkownika oznacza to samo co folder (jak podfoldery, podkatalogi), uważam, że z technicznego punktu widzenia „katalog” powinien brzmieć jak kwalifikowany adres do celu, a nie do samego celu. Więcej poniżej.

    1. Podfoldery : W odniesieniu do users OddThinkingi Documentssą podfolderami.
    2. Podkatalogi : W odniesieniu do users OddThinking\, OddThinking\Documents\i OddThinking\Documents\My Source\Widget\są podkatalogi. Ale często nie musimy się tym przejmować, prawda?
    3. Folder podrzędny : W odniesieniu do users OddThinkingjest folder podrzędny (a także podfolder)
    4. Folder nadrzędny : For OddThinking usersjest folderem nadrzędnym (wystarczy wspomnieć o różnych terminologiach, nic wielkiego).
  4. Katalog lub nazwa katalogu : pierwszy z nich jest używany ogólnie w prawdziwym życiu, drugi to kod. Odnosi się to do w pełni kwalifikowanej ścieżki (lub po prostu pełnej ścieżki ) do folderu nadrzędnego celu . W twoim przypadku C:\users\OddThinking\Documents\My Source\Widget(Tak, katalog nigdy nie powinien wskazywać pliku). Używam nazwy katalogu w moim kodzie, ponieważ katalog jest klasą w .NET, a nazwa katalogu jest tym, co sama biblioteka nazywa. Jest dość spójny z nazwą katalogu używaną w systemach UNIX.

  5. Nazwa pliku lub Basename : nazwa pliku wraz z rozszerzeniem. W twoim przypadku: foo.src. Powiedziałbym, że do celów nietechnicznych wolę nazwę pliku (to jest to, co oznacza dla użytkownika końcowego), ale dla celów technicznych ściśle trzymałbym się nazwy basename . Nazwa pliku jest często używana przez MS, ale jestem zaskoczony, że nie są one spójne nie tylko w dokumentacji, ale nawet w bibliotece . Nazwa pliku może oznaczać basename lub pełną ścieżkę do pliku. Dlatego preferuję basename, tak nazywam je w kodzie. Ta strona na wiki również mówi, że nazwa pliku może oznaczać albo pełną ścieżkę, albo nazwę basenu. Zaskakująco, nawet w .NET mogę znaleźć użycie nazwy basename, co oznacza nazwę katalogu głównego pliku.

  6. Rozszerzenie lub rozszerzenie nazwy pliku lub rozszerzenie pliku : podoba mi się ten ostatni. Wszystko odnosi się do tej samej rzeczy, ale o to, co znowu jest przedmiotem debaty! Wiki twierdzi, że tak było src, ale pamiętam, że wiele języków interpretuje to jako .src. Uwaga kropka. Więc po raz kolejny uważam, że dla zwykłych zastosowań nie ma znaczenia, co to jest, ale jako programista zawsze widzę rozszerzenie jako .src.

    Ok, mogłem spróbować pobrać niektóre standardowe zastosowania, ale oto dwie z moich konwencji, których przestrzegam. I chodzi o pełne ścieżki.

    1. Na ogół nazywam pełną ścieżkę wskazującą plik jako ścieżkę pliku . Dla mnie ścieżka pliku jest wyraźna, mówi mi, co to jest. Chociaż w nazwie pliku znajduję go jako nazwę pliku, w swoim kodzie nazywam go nazwą pliku . Jest to również zgodne z „ nazwą katalogu ”. Od strony technicznej nazwa odnosi się do w pełni kwalifikowanej nazwy! Frustrujące jest to, że .NET używa terminu nazwa pliku (więc mam tutaj swoją sprawę), a czasem ścieżki pliku.

    2. Pełną ścieżkę nazywam katalogiem katalogiem. W rzeczywistości można nazwać dowolny adres, który nie wskazuje pliku, katalogiem. Podobnie C:\users\OddThinking\Documents\My Source\jak katalog, C:\users\OddThinking\katalog, a nawet OddThinking\Documents\My Source\(lepiej nazwać go podkatalogiem lub jeszcze lepszą ścieżką względną - wszystko zależy od kontekstu, z którym mamy do czynienia). Powyżej wspominałem coś innego o katalogu, którym jest nazwa katalogu. Oto moje zdanie na ten temat: znajdę nową ścieżkę, aby uniknąć zamieszania. Co to D:\Fruit\Apple\Pip\jest Katalog. Ale jeśli pytanie brzmi, jaki jest katalog lub nawet lepsza nazwa katalogu D:\Fruit\Apple\Pip\, odpowiedź brzmi D:\Fruit\Apple\. Mam nadzieję, że to jasne.

    Powiedziałbym, że lepiej nie martwić się o ostatnie dwa warunki, ponieważ to powoduje najwięcej zamieszania (dla mnie osobiście). Wystarczy użyć terminu pełna ścieżka !

Aby odpowiedzieć:

  1. w odniesieniu do ścieżki, którą podałeś

    A) Nie mam pojęcia. W każdym razie nigdy nie musiałem sam tego robić.

    B) basename

    C) Na razie nazwałbym to rozszerzeniem pliku, jestem najmniej zmartwiony, ponieważ nigdy nie potrzebowałem tego samego w nazwie kodu.

    D) rozszerzenie pliku na pewno.

    E) Nie sądzę, że jest to wymóg ogólnego celu. Brak pomysłu. W katalogu podstawowym .NET jest taka sama jak nazwa katalogu.

    F) ścieżka względna

    G) folder (folder nadrzędny do basename foo.src)

    H) nazwa katalogu

    I) pełna ścieżka (lub nawet nazwa pliku)

  2. ogólnie (przepraszam za to, że jestem trochę gadatliwy, tylko po to, by doprowadzić do sedna sprawy), ale zakładanie, foo.srcże to plik

    A) NA

    B) basename

    C) NA

    D) rozszerzenie

    E) katalog lub po prostu ścieżka

    F) ścieżka względna

    G) NA

    H) katalog lub po prostu ścieżka

    I) pełna ścieżka (lub nawet nazwa pliku)

Dalsza jazda z jednym przykładem z mojej strony:

  1. Rozważ ścieżkę C:\Documents and Settings\All Users\Application Data\s.sql.

    1. C:\Documents and Settings\All Users\Application Data\s.sql to pełna ścieżka (która jest nazwą pliku)
    2. C:\Documents and Settings\All Users\Application Data\ to nazwa katalogu.
  2. Teraz rozważ ścieżkę C:\Documents and Settings\All Users\Application Data

    1. C:\Documents and Settings\All Users\Application Data jest pełną ścieżką (która jest katalogiem)
    2. C:\Documents and Settings\All Users to nazwa katalogu.

Dwie moje wskazówki:

  1. Stosuję się do ogólnej zasady, że jeśli chodzi o adresowanie pełnego adresu, niezależnie od jego rodzaju, prawie zawsze nazywam go „pełną ścieżką”. To nie tylko eliminuje użycie dwóch terminologii dla ścieżki pliku i ścieżki folderu, ale także pozwala uniknąć potencjalnego zamieszania, jeśli zamierzasz nazwać ten plik jako nazwę pliku (co dla większości użytkowników od razu przekłada się na basename). Ale tak, jeśli musisz sprecyzować rodzaj ścieżki, lepiej nazwać ją nazwą pliku lub katalogiem zamiast bardziej ogólnej „ścieżki”.

  2. Cokolwiek byś nie pomyślał, bądź z nim zgodny. Mieć porozumienie między członkami zespołu, że to oznacza to, a nie to.

Teraz, gdy tylko z kręgu mam trochę praktyki. Nowa marka terminów byłaby używana na komputerach z systemem OS X i Android. Wszystko to dotyczy fizycznych ścieżek w systemie plików. W przypadku adresów internetowych pojawiłby się zupełnie nowy zestaw terminologii. Oczekuję, że ktoś wypełni pustkę w tym samym wątku :) Z przyjemnością usłyszę konwencję, z którą poszliście.

nawfal
źródło
Przez długi czas używałem słowa „ścieżka”, aby oznaczać całą ścieżkę bezwzględną, w tym pełną nazwę pliku. Twoja odpowiedź, inni tutaj i zasoby gdzie indziej zmieniły zdanie na ten temat, a teraz użyję do tego słowa „pełna ścieżka”, „ścieżka” dla lokalizacji bez nazwy pliku oraz „nazwa pliku” lub „nazwa” nazwy pliku samo.
Nate
24

W C ++ Boost.Filesystem opracował nomenklaturę dla różnych części ścieżki. Szczegółowe informacje zawiera dokumentacja referencyjna dekompozycji ścieżki , a także ten samouczek .

Oto podsumowanie oparte na samouczku. Dla:

  • Ścieżka systemu Windows: c:\foo\bar\baa.txt
  • Ścieżka uniksowa: /foo/bar/baa.txt

dostajesz:

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

Norma C ++ ISO / IEC 14882: 2017

Ponadto terminologia Boost.Filesystem została przyjęta przez C ++ 17 => Patrzstd::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
Emile Cormier
źródło
6
Jak oni nazywają to wszystko? path, fullpath?
wisbucky,
@wisbucky Cała rzecz nazywa się w ich nomenklaturze „ścieżką”.
Emile Cormier
1
@wisbucky Naprawiono link. Dzięki.
Emile Cormier
@olibre: Dzięki za aktualizację C ++ 17. Ale stem()jest częścią nazwy pliku , a nie ścieżki .
Emile Cormier,
1
@ johnc.j. Bo szkoda, bo system plików nie był tak dobrze znany, kiedy pytanie zostało zadane po raz pierwszy. Wolę przyjąć nomenklaturę recenzowanej biblioteki niż sam coś wymyślić.
Emile Cormier
9

pathlibStandardowa biblioteka Pythona ma świetną konwencję nazewnictwa dla komponentów ścieżki: https://docs.python.org/3/library/pathlib.html

a) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo .src

trzon

b) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

imię

c) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo. src (bez kropki)

[nic]

d) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo .src (z kropką)

przyrostek

e) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

ścieżka dziadka

f) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

ścieżka względna do ścieżki dziadka

g) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

imię rodzica

h) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

ścieżka rodzica

i) C: \ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

ścieżka

Maggyero
źródło
8

Nie, nie jesteś szalony.

W systemach Windows czasami ścieżka katalogu zawierającego plik nazywa się ścieżką i tak właśnie było od samego początku. Na przykład

    x:\dir1\dir2\myfile.txt

    Windows:
    --------
        PATH:  x:\dir1\dir2
        FILE:  myfile.txt

    Unix/Linux:
    -----------
        PATH:  /dir1/dir2/myfile.txt
        FILE:  myfile.txt

Podejście Unix / Linux jest o wiele bardziej logiczne i wszyscy o tym wspominali wyżej: ścieżka zawierająca samą nazwę pliku. Jeśli jednak wpiszesz „zadzwoń /?” w wierszu polecenia systemu Windows otrzymujesz:

    %~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

Oto „tylko ścieżka” i „tylko nazwa pliku”. Jednocześnie odnoszą się do całego ciągu jako „w pełni kwalifikowanej nazwy ścieżki”, która jest rozumiana jako litera dysku plus ścieżka plus nazwa pliku. Więc nie ma prawdziwej prawdy. To daremne. Zostałeś zdradzony.

Tak czy siak,

Odpowiedzieć na Twoje pytanie

Oto jak nazwałbym twoje przykłady:

A: -
B: basename
C: extension
D: -
E: -
F: -
G: -
H: pathname (or dirname or containing path)
I: full name

ADEF nie ma prostych pseudonimów. A ponieważ php jest prawdopodobnie najbardziej znanym językiem wieloplatformowym, wszyscy rozumieją „basename” i „dirname”, więc trzymam się tej nazwy. Pełna nazwa jest również oczywista; pełna ścieżka byłaby nieco niejednoznaczna, ale przez większość czasu oznacza to to samo.

dkellner
źródło
1
Przez długi czas używałem słowa „ścieżka”, aby oznaczać całą ścieżkę bezwzględną, w tym pełną nazwę pliku. Inne odpowiedzi tutaj i inne zasoby zmieniły zdanie na ten temat, a teraz użyję do tego słowa „pełna ścieżka”, „ścieżka” dla lokalizacji bez nazwy pliku oraz „nazwa pliku” lub „nazwa” dla samej nazwy pliku.
Nate