Странният свят на файловите пътища в ОС Windows

Оригиналът е на Erik Jälevik

Най-четени

Даниел Десподов
Даниел Десподов
Новинар. Увличам се от съвременни технологии, информационна безопасност, спорт, наука и изкуствен интелект.

Пътищата на файловите системи в операционната система Windows са по-странни, отколкото бихте си помислили. Във всяка система, произхождаща от Unix, пътищата са изненадващо прости: ако нещо започва с /, то е път. Но нещата са съвсем различни при Windows, където има зашеметяващо разнообразие от схеми за създаване на файловите пътища.

Когато преди време реализирах функцията за автоматично довършване на файловия път във Fileside 1.7, трябваше да проуча този проблем по-отблизо, за да не пропусна нещо. В тази статия ще разкажа за моите открития.

Струва си да се отбележи, че статията е ограничена до вида пътища, които вижда потребителят в приложенията на Windows (управлявани от Win32 API). Под този слой има още по-любопитни неща, засягащи най-вече тези, които пишат драйвери за хардуер и други подобни.

Съвсем накратко

Форматите на абсолютните пътища
Наименование Примери
Път до диск C:\Program Files\HAL 9000
UNC-път \\Media\Pictures\Worth\1000 words
Път до устройство (буквален) \\?\D:\Plans\Marshall
Път до устройство (нормализиран \\.\D:\Projects\Human Genome
Форматите на относителните пътища
Наименование примери
Относителни към текущата папка .\Manhattan..\Plans
Относителен към текущия диск \Pacts
Относителен към текущата папка на диска D:Warsaw
Забранени символи
Символи Валидност
< > ” / \ |? * Никога не се допускат
. не се допуска като последен символ
: Не се допуска, с изключение на поток от данни
Ограничения в дължината
Елемент Максимална дължина
Път 32767 (или 260) символа
Име на файл или на папки 255 символа

Схема на пътищата при ОС Windows

В ОС Windows има три различни типа абсолютен път и три различни типа относителен път.

Абсолютни пътища

Абсолютните или пълните пътища са цялостни завършени пътища, които сами по себе си еднозначно идентифицират дадено място във файловата система.

Пътища до дисковете

Пътищата до дисковете са старите добри пътища, които добре познаваме и обичаме, които се състоят от буквата на диска и папка или поредица от папки:

D:\Doughnut preferences\With jam in
UNC пътищата

UNC е съкращение от Universal Naming Convention (Универсална конвенция за именуване) и представлява описание на файл, започващо с \\, което често се използва за обозначаване на мрежови дискове. Първият сегмент след \\ е хостът, който може да бъде или име на сървър, или IP адрес:

\\Work\Hard
\\192.168.1.15\Hard

Но UNC пътищата могат да се използват и за достъп до локалните дискове:

\\localhost\C$\Users\Andrew Fletcher
\\127.0.0.1\C$\Users\Alan Wilder

А може да се използва и името на конкретния компютър:

\\Pipeline\C$\Users\Martin Gore

Символът $ в C$ означава скрита административна споделена папка; той не замества двоеточието до името на устройството „:„. Споделените дискове в стил C$ са просто удобни преки пътища, които се създават автоматично от Windows. Можете да получите достъп до дисковете чрез тях само ако сте влезли в системата като администратор.

Заслужава да се отбележи също, че самият \Pipeline не потвърждава пътя до папката, а само идентифицира сървъра. За да получите достъп до папката, трябва да добавите името на споделената папка.

Пътищата до устройствата

Пътят към дадено устройство започва с един от следните фрагменти:

  • \\?\
  • \\.\

Освен за файлове и папки те могат да бъдат използвани за адресирането на физически устройства (дискове, принтери, дисплеи и т.н.). Никак не прилича на това, което използваме в ежедневието при работа с файловете, но е полезно да се знае, ако някъде срещнете нещо подобно.

Синтаксисът до локална папка може да стане чрез един от следните варианти:

\\?\Z:\Animals\Cute
\\.\Z:\Animals\Cunning

Ако имате нужда от още допълнителна загадъчност, вместо обикновения Z: можете да поставите идентификатора на устройството:

\\?\Volume{59e01a55-88c5-411f-bf0b-92820bdb2548}\Animals\Cryptic

Тук Volume{59e01a55-88c5-411e-bf0a-92820bdb2549} е идентификаторът на дисковия дял, който се намира в диска Z: на този компютър.

И още, има специален синтаксис за описване на UNC пътищата до дадено устройство:

\\?\UNC\localhost\Z$\Animals\Curious

В пътищата до устройството частта, която следва след \\?\ или \\.\  е име, определено във вътрешното пространство на имената Object Manager на Windows. На който му е интересно да изследва това пространство, може да изтегли помощната програма WinObj и да разгледа тези чудеса.

Нормализираните и литералните пътища до устройствата

Каква всъщност е разликата между \\?\ и \\.\?

Обикновено, когато подадете път на операционната система Windows, тя го прочиства, преди да го използва. Този процес се нарича нормализация и по-долу ще разкажем повече за него.

Пътят \\?\ пропуска този етап на прочистване, а \\.\ не го пропуска. Ето защо можем да наречен пътищата от типа \\?\ литерални пътища до устройствата, а \\.\  – нормализирани пътища до устройствата.

Да допуснем, че по някаква неизвестна причина имате файл с невероятното име „..“ (например, може да е създаден на мрежово устройство в съвсем друга система). Обикновено не бихте могли да получите достъп до него, тъй като нормализацията го преобразува в родителската папка, но благодарение на буквалния (литерален) път до устройството това може да се направи.

Относителните пътища

Относителните пътища са непълни пътища, които за задаване на уникалната идентификация на местоположението трябва да бъдат комбинирани с други пътища.

Пътища, относителни към текущата папка

Тези пътища използва в качеството на начална точка текущата папка. Така например .\Torquay се отнася до подпапката на текущата папка, а ..\Wales се отнася до подпапката на родителя на текущата папка.

Папки, относителни спрямо корена на текущия диск

Ако пътят започне със символа \, то той автоматично се интерпретира като корена н текущия диск. Така например, ако се намирате в диска Е: и въведете \Africa, то ще се окажете в

Папки, относителни спрямо корена на текущия диск

Ако пътят започне със символа \, то той автоматично се интерпретира като корена н текущия диск. Така например, ако се намирате в диска Е: и въведете \Africa, то ще се окажете в E:\Africa.

Но когато достъпът до текущата папка се извършва чрез UNC път, то пътят, относителен към текущия диск с интерпретира относително общата коренова папка, като например \\Earth\Asia

Пътищата, относителни към текущата папка на диска

Тези много по-рядко използвани пътища указват дисковете без обратната наклонена черта, като например E:Kreuzberg и се интерпретират относително текущата папка на това запомнящо устройство. Всъщност това има смисъл само в контекста на средата на командния ред, която следи текущата работна папка на всеки диск.

Това е единственият тип пътища, който не се поддържа от моята програма Fileside, понеже няма информация за текущата папка на всеки диск.

Нормализацията

Както вече споменахме, всички пътища, с изключение на литералните, преди използване преминават процес на нормализация. Той се състои от следните няколко етапа:

  • Замяна на наклонените черти (/) с обратно наклонени черти (\)
  • Свиване на повтарящите се разделители във вид на обратно наклонени черти до само един разделител
  • Обработка на относителните пътища чрез замяна на всички . или ..
  • Премахване на спейсовете и точките в края

По този начин, само в общия случай в ОС Windows могат да се указват пътища с помощта на обикновени наклонени черти.

Правилата на наименованията в ОС Windows

Нека сега да разгледаме отделните елементи, от които е съставен всеки от тези пътища. Има множество ограничения в имената, които могат да бъдат използвани като имена на файлове и папки.

Забранени символи

В имената не е разрешено да се използват следните символи:

< > " / \ | ? *

Също така не могат да се използват непечатимите символи с ASCII код, по-малък от 32

Хитрото двоеточие

В повечето случаи използването на символа : е забранено.

Но има едно много екзотично изключение във вида на променените потоци данни на файловата система NTFS, при които двоеточието се използва като разделител между имената. Не е особено известно, че в някои контекстни случаи е възможно вътре във файла да се запише скрит фрагмент от данни, добавяйки към неговото име суфикс, предшестван именно като двоеточие.

Опасната точка

Символът . е допустим във вътрешността или в началото на името на файла, но е забранено да се поставя в края

Сепейсове в началото и края

Интересно е, че Windows допуска наличето на спейсове в началото на имената, но не и в техния край. Тъй като едно име със спейсове в началото и в край изглежда съвсем по един и същи начин като име без никакви спейсове, обикновено това е една наистина ужасна идея. Ето защо програмата Fileside  автоматично ги премахва.

Забранените имена

По исторически причини не могат да се използват следните имена:

CONPRNAUXNULCOM0COM1COM2COM3COM4COM5COM6COM7COM8COM9LPT0LPT1LPT2LPT3LPT4LPT5LPT6LPT7LPT8 и LPT9.

Това включва и имената с разширения. Така например, ако създадете файл с име COM1.txt, то операционната система ще го преобразува в \\.\COM1\ и Windows ще го интерпретира като устройство. Едва ли бихте искали нещо подобно.

Чувствителност към регистъра

В повечето случаи Windows не прави разлика между главни и малки букви.

C:\Polish hamletc:\polish HamletC:\Polish Hamlet и C:\POliSh hAMlETсе считат за абсолютно еднакви.

Но с обновяването на Windows 10 от месец април 2018 година файловата система NTFS вече има опция за включване на чувствителността към регистъра, след което тази ОС започва да прави разлика в имената с главни и малки букви.

Ограничения в дължината

Все още не сме приключили. Има ограничения и в дължината.

Пътищата

Традиционно дължината на пътищата в ОС Windows не можеше да превишава 260 символа. Дори и днес това важи за някои приложения, в които разработчиците не са взели мерки да заобиколят това ограничение.

Това заобикаляне се осъществява чрез преобразуването на всеки път в литерален път към хипотетично устройство преди той да бъде подаден на Windows. По този начин ограничението от 260 символа престава да важи и дължината на пътя може да бъде доста щедрите 32767 символа.

Имената

Имената на файловете и папките не могат да бъдат по-дълги от 255 символа.

Толкова много начини да кажеш едно и също

Въоръжени с тези знания разбираме, че можем да създадем на практика неограничен брой различни пътища, които ще указват една и съща папка.

Ето няколко примера:

  • C:\CHAMELEON
  • c:\chameleon
  • C:\/\\//\\\///Chameleon
  • C:\Windows\..\Users\..\Chameleon
  • \\localhost\C$\Chameleon
  • \\127.0.0.1\C$\Chameleon
  • \\?\C:\Chameleon
  • \\.\C:\Chameleon
  • \\.\UNC\localhost\C$\Chameleon
  • \\?\Volume{59e01a55-88c5-411e-bf0a-92820bdb2549}\Chameleon
  • \\.\GLOBALROOT\Device\HarddiskVolume4\Chameleon
  • и така нататък

Ето какво се получава, когато се налага да се осигури пълната обратна съвместимост в продължение на няколко десетилетия!


Тази статия събра огромен брой коментари. Редица потребители обърнаха внимание, че на практика същият legacy зоопарк може да се види и в macOS, която трябва да е напълно съвместима с много старата класическа MacOS. Но това е тема за друг бъдеш материал.

АбонаментВсичко важно от света на технологиите, директно в пощата ти.

С абонирането приемате нашите Условия и Политика за поверителност. Може да се отпишете с един клик по всяко време.


Коментирайте статията в нашите Форуми. За да научите първи най-важното, харесайте страницата ни във Facebook, и ни последвайте в Google Новини, TikTok, Telegram и Viber или изтеглете приложението на Kaldata.com за Android, iPhone, Huawei, Google Chrome, Microsoft Edge и Opera!

Нови ревюта

Подобни новини