Ім'я файлу? Назва шляху? Базова назва? Називання стандарту для шматочків шляху


228

Я постійно тримаю себе у вузлах, коли я маніпулюю шляхами та іменами файлів, тому що у мене немає загальної системи імен, яку я використовую.

Мені потрібно придумати стандарт іменування і дотримуватися його, і я хотів би бути чітким і послідовним з іншими, тому я відкриваюся, щоб дізнатися канонічні відповіді.

Розглянемо цю проблему з іграшками: (приклад Windows, але, сподіваємось, відповідь має бути незалежним від платформи)

Вам дали повне ім’я папки: C: \ users \ OddThinking \ Documents \ My Source. Ви хочете пройтися під папками під ними та зібрати всі .src до .obj.

У якийсь момент ви переглядаєте наступну рядок.

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

Отже, які імена ідентифікаторів ви б використали для деталей?

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

Дозвольте дати відповіді, щоб розпочати.

А) базова назва?

В) ім'я файлу? Або це ім'я файлу? Різниця важлива при виборі імен ідентифікаторів, і я ніколи тут не відповідаю.

В) розширення

Г) розширення. Зачекайте, саме так я зателефонував C. Чи слід уникати зберігання крапки і просто вставляти, коли потрібно? Що робити, якщо в певному файлі немає крапки?

Н) назва шляху? Або зачекайте, це просто шлях?

I) ім'я файлу. Зачекайте, це я назвав С. Шлях. Зачекайте, це я назвав H. Можливо, H має бути назвою папки. Невже "папка" не є специфічним для Windows терміном?


Майк Поп, технічний редактор Microsoft, в своєму блозі зазначає, що , хоча керівництво по стилю Microsoft послідовно дотримується двох слів: назва файлу, назва папки, ім'я тома, до них посібник стилю Apple іноді приєднується: ім'я файлу, назва шляху, ім'я тома .
Відмінна думка

А) однозначно не слід називати базовим іменем, оскільки ім'я вже використовується в багатьох місцях для позначення останнього елемента в шляху (для файлу, яке буде ім'ям файлу без dirpath). Деякі місця називають ім'я файлу без розширення stem.
wisbucky

Також, для файлів з декількома періодами (наприклад, foo.src.txt) чи існує стандартний спосіб ідентифікації (і іменування) розширення / с?
користувач117529

Відповіді:


178

Я думаю, що ваш пошук "стандартної" конвенції про іменування буде марним. Ось мої пропозиції на основі існуючих, відомих програм:

A) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo .src

Vim називає його кореневим файлом (: довідка-модифікатор імені файлу)

B) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo.src

ім'я файлу або ім'я бази

C) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo. src (без крапки)

розширення файл / ім'я

D) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo .src (з крапкою)

також розширення файлу . Просто зберігайте без крапки, якщо у файлі немає крапки, у неї немає розширення

E) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo.src

Вершина дерева
Немає умовності, git називає його базовим каталогом

F) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo.src

шлях від верхівки дерева до
відносної стежки листя

G) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo.src

один вузол дерева
не умовний, можливо, простий каталог

H) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo.src

ім’я реж

I) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo.src

повний / абсолютний шлях


8
Це стає поза темою, але будьте обережні, зберігаючи розширення окремо до крапки. Вам потрібно обробити назви файлів "foo", "foo." і "foo.txt" (і навіть "foo.txt.bak".)
Відміщення

1
привіт, хлопці, чудовий приклад. Було б простіше прочитати, якщо ви поставите відповідь поруч із питанням, а не використовуєте посилання, що змушують прокручуватися вгору. Я вносимо правки до речі, щоб покращити це. Grettings
Віктор

3
Віктор, оскільки Вашу редакцію відхилили (хлопці wtf, це дуже гарне поліпшення!) Я просто це зробив сам :-)
блимаю

1
Бо 1.(назва файлу лише без розширення), я вирішив піти з File Titleдавніх часів через відсутність чіткої конвенції або хоча б глобального консенсусу.
полівертекс

1
Для A(ім'я файлу без розширення) ви можете використовувати stem. Посилання: 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

36

Гарне запитання насамперед, мій +1. Ця річ набридла мені, коли мені довелося один раз створити цілий ряд функцій у класі Utility. GetFileName? або GetFullName? GetApplicationPath означає повний шлях або ім'я каталогу? і так далі. Я родом з .NET фону, тому я думаю, що можу додати трохи більше, щоб інакше відмінна відповідь від @blinry.

Резюме: (Курсивом є те, що я б не використовував як програміст)

  1. Шлях : Шлях вказує унікальне розташування у файловій системі (крім її відносного шляху). Ім'я шляху рідше використовується, але я б дотримувався шляху - він значно пояснює, що це таке. Шлях може вказувати на файл або папку або навіть нічого (C: \). Шлях може бути:

    1. Відносний Шлях : My Source\Widget\також відносний шлях Widget\foo.src. Пояснення самостійно.
    2. Абсолютний шлях або повний шлях : це повністю кваліфікований шлях, який вказує на ціль. Останнім я частіше користуюся останнім. C:\users\OddThinking\Documents\My Source\Widget\foo.srcотже, повний шлях. Дивіться наприкінці того, що я називаю повним шляхом, який вказує на файл і який закінчується як каталог.

    Сторінка вікі та ім'я .NET для шляху є послідовною.

  2. Root Path або Root Directory : Раніше є .NET-конвенцією, тоді як остання більше чується в колах UNIX. Хоча мені подобається і те, і інше, я більше схильний використовувати колишній. У Windows, на відміну від UNIX, є багато різних кореневих шляхів, по одному для кожного розділу. Системи Unix мають один кореневий каталог, який містить інформацію про інші каталоги та файли. Напр. C:\- кореневий шлях.

  3. Папка або ім'я папки : Widget, і OddThinkingт.д. у вашому випадку. Це може бути тільки умова Windows (насправді це моє власне дивне мислення :)), проте я категорично заперечую проти відповіді блискавки "Каталог". Хоча для звичайного каталогу користувача означає те саме , що і папка (як підпапки, підкаталоги), я вважаю, що з технічного кута "каталог" повинен звучати як кваліфікований адресу до цілі, а не самої цілі. Детальніше нижче.

    1. Підпапки : Що стосується users OddThinkingта Documentsє підпапками.
    2. Підкаталоги : Що стосується users OddThinking\, OddThinking\Documents\і OddThinking\Documents\My Source\Widget\є підкаталогами. Але нам не потрібно часто це турбувати, чи не так?
    3. Дочірня папка : стосовно users OddThinkingдочірньої папки (як і підпапки)
    4. Батьківська папка : бо OddThinking usersце її батьківська папка (просто згадуючи різні термінології, нічого не потрібно).
  4. Каталог або ім'я каталогу : Перші, які зазвичай використовуються в реальному житті, другі - в коді. Це стосується повністю кваліфікованого шляху (або просто повного шляху ) до батьківської папки цілі . У вашому випадку C:\users\OddThinking\Documents\My Source\Widget(Так, каталог ніколи не має на меті вказувати на файл). Я використовую ім'я каталогу у своєму коді, оскільки каталог - це клас у .NET, а ім'я каталогу - це те, що сама бібліотека називає його. Він цілком відповідає dirname, що використовується в системах UNIX.

  5. Назва файлу або ім'я файлу : ім'я файлу разом з розширенням. У вашому випадку: foo.src. Я б сказав, що для не технічного використання я віддаю перевагу імені файлу (саме це означає для кінцевого користувача), але для технічних цілей я б чітко дотримувався базового імені . Ім'я файлу часто використовується MS, але я здивований тим, що вони не узгоджуються не лише в документації, але навіть у бібліотеці . Там ім'я файлу може означати або базове ім'я, або повний шлях до файлу. Тому я віддаю перевагу базовим іменам, саме так я їх називаю в коді. Ця сторінка у wiki також говорить, що ім'я файлу може означати або повний шлях, або базове ім'я. Дивно, навіть у .NET я можу знайти базове ім'я використання, щоб означати ім'я кореня файлу.

  6. Розширення або Розширення імені файлу або Розширення файлу : Мені подобається останній. Всі стосуються одного і того ж, але що це - знову питання дискусії! Wiki каже, що це srcще тоді, я пам'ятаю, що читав, що багато мов інтерпретують це як .src. Зверніть увагу на крапку. Тому я знову вважаю, що для випадкового використання це не має значення, що це таке, але як програміст я завжди бачу розширення як .src.

    Гаразд, я б спробував знайти деякі стандартні звичаї, але ось два мої умовності, яких я дотримуюся. І мова йде про повноцінні шляхи.

    1. Я зазвичай називаю повний шлях, який вказує на файл як шлях до файлу . Для мене шлях до файлу - чіткий виріз, він підказує мені, що це таке. Хоча з назвою файлу я знаходжу це як ім'я файлу, у своєму коді я називаю це ім'ям файлу . Це також відповідає " ім'я каталогу ". З технічної сторони назва посилається на повністю кваліфіковане ім'я! Розчаровує .NET використовує назву файлу терміна (тому я маю тут свій випадок), а іноді і шлях до цього файлу.

    2. Я називаю повний шлях, який закінчується як каталог. Насправді можна зателефонувати на будь-яку частину адреси, яка не вказує на каталог файлів. Так C:\users\OddThinking\Documents\My Source\це каталог, C:\users\OddThinking\це каталог або навіть OddThinking\Documents\My Source\(краще назвати його підкаталогом або ще краще відносним шляхом - все, що залежить від контексту, з яким ви маєте справу). Вище я згадав щось інше про каталог, який є ім'ям каталогу. Ось мій погляд на це: я отримаю новий шлях, щоб уникнути плутанини. Що це D:\Fruit\Apple\Pip\? Довідник. Але якщо питання полягає в тому, що таке каталог або ще краще ім'я каталогу D:\Fruit\Apple\Pip\, відповідь D:\Fruit\Apple\. Сподіваюся, це зрозуміло.

    Я б сказав, що краще не турбуватися про останні два терміни, оскільки саме це створює найбільшу плутанину (особисто для мене). Просто використовуйте термін повний шлях !

Щоб відповісти вам:

  1. стосовно шляху, який ви пройшли

    А) Ніякої ідеї. У будь-якому разі мені ніколи не потрібно було отримувати цього.

    Б) основна назва

    C) Я б просто назвав це розширення файлу на даний момент, я, щонайменше, хвилювався, оскільки мені ніколи не потрібно було, щоб це було названо в моєму коді.

    D) розширення файлу напевно.

    Д) Я не думаю, що це є загальною вимогою. Не маю уявлення. У базовому каталозі .NET те саме, що і ім'я каталогу.

    F) відносний шлях

    G) папка (батьківська папка до базового імені foo.src)

    Н) назва каталогів

    I) повний шлях (або навіть ім'я файлу)

  2. в цілому (вибачте за те, що трохи докладно, просто загнати точку додому), але припустимо, що foo.srcце справді файл

    А) НС

    Б) основна назва

    В) НС

    Г) розширення

    E) каталог або просто шлях

    F) відносний шлях

    Г) НС

    H) каталог або просто шлях

    I) повний шлях (або навіть ім'я файлу)

Подальше керування одним прикладом з мого боку:

  1. Розглянемо шлях C:\Documents and Settings\All Users\Application Data\s.sql.

    1. C:\Documents and Settings\All Users\Application Data\s.sql - це повний шлях (який є ім'ям файлу)
    2. C:\Documents and Settings\All Users\Application Data\ - ім'я каталогу.
  2. Тепер розглянемо шлях C:\Documents and Settings\All Users\Application Data

    1. C:\Documents and Settings\All Users\Application Data це повний шлях (який, як буває, каталог)
    2. C:\Documents and Settings\All Users - ім'я каталогу.

Дві мої поради:

  1. Я дотримуюся цього правила, що якщо мова йде про повну адресу незалежно від її типу, я майже завжди називаю це "повним шляхом". Це не тільки виключає використання двох термінологій для шляху до файлу та шляху до папки, але також дозволяє уникнути можливої ​​плутанини, якщо ви збираєтесь назвати це ім'я файлу як ім'я файлу (що для більшості користувачів відразу перекладається на базове ім’я). Але так, якщо вам потрібно конкретизувати тип шляху, його краще назвати, а потім ім'я файлу або каталог, а не загальний "шлях".

  2. Як би там не було, ви б мали на увазі свою власну ідею, будьте узгоджені з нею протягом усього часу. У членів команди є консенсус, що це означає це, а не це.

Тепер, коли я просто з кола, я маю певну практику. Новою маркою термінів буде те, що використовується на OS X та андроїд-машинах. І все це лише про фізичні шляхи у файловій системі. Зовсім новий набір термінологій виникне у випадку веб-адрес. Я очікую, що хтось заповнить порожнечу в цій самій нитці :) Я був би радий почути конвенцію, з якою ви пішли вперед ..


Я давно використовую слово "ім'я шляху", щоб означати весь абсолютний шлях, включаючи повне ім'я файлу. Ваша відповідь, інші тут і ресурси в інших місцях змінили свою думку про це, і тепер я буду використовувати для цього слово "fullpath", "path" для розташування без імені файлу, а також "filename" або "name" для імені файлу себе.
Нейт

24

У C ++ Boost.Filesystem розробила номенклатуру для різних частин шляху. Детальні відомості див. У довідковій документації щодо декомпозиції шляху , а також у цьому посібнику .

Ось підсумок на основі навчального посібника. Для:

  • Шлях до Windows: c:\foo\bar\baa.txt
  • Шлях Unix: /foo/bar/baa.txt

Ви отримуєте:

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

C ++ стандарт ISO / IEC 14882: 2017

Більше того, термінологія Boost.Filesystem була прийнята C ++ 17 => Дивstd::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

6
Як вони тоді називають всю річ? path, fullpath?
wisbucky

@wisbucky У своїй номенклатурі вся справа називається "шлях".
Еміль Корм'є

1
@wisbucky Виправлено посилання. Дякую.
Еміль Корм'є

@olibre: Дякую за оновлення C ++ 17. Але stem()це частина імені файлу , а не шлях .
Еміль Корм'є

1
@ johnc.j. Надто погана система Boost.Files була не так відома, коли питання було вперше задано. Я вважаю за краще прийняти номенклатуру рецензованої бібліотеки, ніж зробити щось самостійно.
Еміль Корм'є

9

pathlibСтандартна бібліотека Python має чудову умову іменування компонентів шляху: https://docs.python.org/3/library/pathlib.html

а) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo .src

стебло

b) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo.src

назва

в) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo. src (без крапки)

[нічого]

г) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo .src (з крапкою)

суфікс

д) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo.src

грандіозний батьківський шлях

f) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo.src

відносний шлях до великого батьківського шляху

g) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo.src

ім'я батьків

h) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo.src

батьківський шлях

i) C: \ користувачів \ OddThinking \ Документи \ Моє джерело \ Віджет \ foo.src

шлях


8

Ні, ти не божевільний.

В системах Windows іноді шлях до каталогу, що містить файл , називається шлях , яким він був з самого початку. Так, наприклад,

    x:\dir1\dir2\myfile.txt

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

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

Підхід Unix / Linux набагато логічніший, і це те, що всі згадували вище: шлях, включаючи саме ім'я файлу. Однак якщо ви введете "call /?" у командному рядку Windows ви отримуєте це:

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

Отже, це "лише шлях" та "лише ім'я файлу". У той же час вони називають цілу рядок як "повністю кваліфіковане ім'я шляху", яке розуміється як літера диска плюс шлях плюс ім'я файлу. Тож реальної правди немає. Це марно. Вас зрадили.

У будь-якому випадку,

Щоб відповісти на ваше запитання

Ось як я назвав ваші приклади:

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

У ADEF немає простих прізвиськ. А оскільки php - це, мабуть, найбільш широко відома міжплатформна мова, всі розуміють "базову назву" та "ім'я dirname", тому я б дотримувався цього іменування. Повна назва також очевидна; повний шлях був би дещо неоднозначним, але більшість часу це означає саме те саме.


1
Я давно використовую слово "ім'я шляху", щоб означати весь абсолютний шлях, включаючи повне ім'я файлу. Інші відповіді тут і ресурси в інших місцях змінили свою думку про це, і тепер я буду використовувати для цього слово "fullpath", "path" для розташування без імені файлу, а "name" або "name" для самого імені файлу.
Нейт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.