Що таке "канонічний шлях"?


82

Отже, абсолютний шлях - це спосіб дістатися до певного файлу або місця, що описує повний шлях до нього, повний шлях та це залежить від ОС (абсолютні шляхи для Windows та Linux, наприклад, різні). Відносний шлях - це маршрут до файлу чи розташування, яке описано з поточного місцезнаходження .. (дві крапки), що вказує на вищий рівень у дереві каталогів. Це мені було зрозуміло вже кілька років.

Під час пошуку я навіть бачив, що є і канонізовані файли! Все, що я знаю, це КАНОНІЧНЕ означає щось на кшталт "за правилами" чи щось інше.

Хто-небудь може мене просвітити в термінах теорії про канонічні речі?


5
Під "ТАК" ви маєте на увазі "ОС"? Ви француз?
Kerrek SB

"Système d'exploitation" так, я знаю французьку, але я мав на увазі ОС (неправильно написано, вибачте, хе-хе) Операційна система ... Я насправді мексиканець xD
Метафаніель

4
Ааа, "Система операційної діяльності, ¡оле!" (І це, до речі, "Операційна система".)
Kerrek SB

5
Еммм ... xD Насправді це має бути "Система Оперативо", а Оле - це цілком іспанська (Іспанія), і так, я знаю, що вона працює, я знову зазнав невдачі, мене відволікло ха-ха Спасибі =)
Метафаніель

@Editor, хоча я погоджуюсь, що немає справжнього слова "канонізований", також помилково вважати, що розробники не переслідують слова ("enverb") постійно . Для цілей пошуку будь-який, можливо, працював би.
Дейв Ньютон,

Відповіді:


94

Весь сенс зробити що- небудь "канонічним" полягає в тому, що ви можете порівняти дві речі. Наприклад, обидва ../../here/bar/xта ./test/../../bar/xможуть посилатися на одне і те ж місце, але ви не можете зробити текстове порівняння за двома шляхами. Однак, якщо перетворити їх у їх канонічне подання, вони обидва стають ../bar/x, і ми бачимо, що вони насправді стосуються одного і того ж.

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

(Якщо ви шукаєте більше прикладів, вся математика наповнена "канонічними" конструкціями для всіляких об’єктів і дуже з тією ж метою на увазі. Можливо, ця стаття у Вікіпедії може надати деякі додаткові вказівки.)


1
Оу, я бачу зараз ... Отже, коротше канонічне повинно бути унікальним, отже це дуже повний шлях без відносного використання двох крапок. Ой! Ваша відповідь була корисною;) Дякую
Метафаніель

@ Метафаніель: Так, найважливіша частина - це унікальність. Я думаю, ви можете мати як канонічний відносний, так і канонічний абсолютний шлях, але це незалежне розрізнення.
Kerrek SB

1
Все було добре і правильно до цього коментаря xD Добре, я зрозумів, але ... канонічний відносний шлях? Як я розумів дотепер (дякую всім), канонічні шляхи є абсолютними за своєю природою. Що ви можете сказати мені про канонічні відносні шляхи? = S THANKS =)
Метафаніель

1
@Metafaniel: Канонічний відносний шлях буде відносно заданого, фіксованого робочого каталогу. Щодо даного каталогу, ви можете сформувати унікальні відносні шляхи. Але ви можете порівняти лише ті, що стосуються того самого робочого каталогу. Навпаки, канонічні абсолютні шляхи можна порівнювати у всьому світі.
Kerrek SB

1
це не працює, якщо ви дозволяєте жорсткі або м’які посилання на каталоги чи файли ... У такому випадку визначити канонічний шлях набагато складніше (див. відповідь @alfasin).
Жан-Батіст Юнес

28

Хорошим способом визначення канонічного шляху буде: the shortest absolute path(короткий, у значенні довжина рядка).

Це приклад різниці між абсолютним шляхом і канонічним шляхом:

абсолютний шлях: C:\abc\..\abc\file.txt
канонічний шлях:C:\abc\file.txt


1
Відповідно до @KerrekSB шлях повинен бути унікальним, щоб бути канонічним, тому у вашому прикладі я це бачу: немає іншого способу представити C: \ abc \ file.txt Дякую за приклад =)
Метафаніель

2
@alfasin: Microsoft, здається, не погоджується з вашим твердженням, що "в Windows немає канонічного шляху", про що свідчить функція Windows API PathCanonicalize . І хоча це правда, що Windows, як правило, не застосовує чутливість до регістру в шляхах (хоча це залежить від обсягу), Windows дійсно зберігає регістр кожного символу у шляху, навіть якщо він надає доступ до регістру без урахування регістру. У кожному разі, я все ще стверджую, що найкоротший можливий абсолютний шлях не обов'язково є канонічним.
Ден Корн,

2
@DanKorn скажи їм сперечатися з визначенням канонічного . Що стосується вашої незгоди, ви можете мати рацію, але я все ще не бачив хорошого контраприкладу;)
Нір Альфасі

2
@alfasin: Мені здається, що, окрім визначень словників, Microsoft отримує можливість визначити, що означають їхні власні терміни у власній операційній системі та API. Хто є вищим авторитетом щодо того, що канонічне в Windows, ніж вони? І чому "C: \ PROGRA ~ 1" не є хорошим контраприкладом до вашого твердження, що найкоротший шлях є канонічним за визначенням?
Ден Корн,

3
@DanKorn при всій повазі до Microsoft (і я їх поважаю) вони не можуть визначити, що означає канонічне. Канонічне означає "унікальне" або "унікальне подання". Оскільки ОС Windows не чутлива до регістру, за визначенням не може бути єдиного унікального подання будь-якого шляху. Це може бути абсолютним, але не канонічним. Якщо це міркування не здається вам розумним, ви можете не погодитися, але оскільки це обговорення стає марним (я продовжую повторювати та пояснювати свої слова), давайте виріжемо його тут і погодимось не погодитися.
Nir Alfasi,

6

Що таке канонічний шлях (або його відмінність від абсолютного шляху) залежить від системи.
Зазвичай, якщо (повний) шлях містить псевдоніми, ярлики або символічні посилання, канонічний шлях вирішує все це у фактичних каталогах, на які вони посилаються.
Приклад: якщо /bin/aце символьне посилання, ви можете знайти його де завгодно для абсолютного шляху, наприклад з java.io.File # getAbsolutePath, тоді як реальний файл (тобто фактична ціль посилання), тобто usr/local/bin/aбуде повертатися як канонічний шлях, наприклад з java.io.File # getCanonicalPath


Досить корисний ваш коментар, щоб я його теж зрозумів! Зараз я навіть не думав про символьні посилання! Тож символічне посилання є абсолютним, АЛЕ не канонічним ... Дуже вичерпним. Втім, у мене є нові сумніви ... А як щодо жорстких посилань? Вони недостатньо абсолютні? ДЯКУЄМО
Метафаніель

Залежить. Наприклад, java.io.File # getCanonicalPath не вирішує жорсткі посилання
Cratylus

1
Я не так багато розвивав Java, я в основному хлопець PHP;) Дякую за роз'яснення =)
Метафаніель

повторно жорсткі посилання: немає такого поняття, як вирішення жорсткого посилання на канонічну форму. Якщо два файли жорстко пов'язані між собою, вони обидва вказують на однакові дані на диску, тому канонічної форми більше не існує, а лише два однакові файли, дані яких фактично займають однаковий простір на диску. Який із файлів був пов’язаний із даними на диску першим, не має відношення до концепції канонічного іменування. Дивіться stackoverflow.com/questions/185899/…
Конні Доббс

2

Найбільше проблем із канонічними шляхами виникає, коли ви передаєте ім'я каталогу, а не файлу. Для файлу, якщо ми надаємо абсолютний шлях, який також є канонічним шляхом. Але для dir це означає пропуск останнього "/". Наприклад, "/ var / tmp / foo" - це канонічний шлях, тоді як "/ var / tmp / foo /" - ні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.