A prečo vlastne nemôžu názvy súborov obsahovať otázniky, lomky a úvodzovky? Čo sa Microsoftu na nich nepáči a prečo nám ich zakazuje? Dá sa toto obmedzenie vôbec nejako obísť?

Ak používate Windows už nejaký čas, celkom určite viete, že nie všetky znaky na klávesnici je možné použiť pri pomenovaní vašich priečinkov a súborov. Skôr či neskôr sa pokúsite použiť otáznik či hviezdičku, na čo vás Windows obvykle malou bublinkou upozorní, že tieto znaky nie sú povolené.

Mnoho ľudí však netuší, že okrem týchto znakov nie je možné použiť ani niektoré názvy, zložené z bežných písmen, pričom ide napríklad o CON či PRN. Ak na tieto názvy narazíte náhodne, celkom určite vás to zaskočí a začnete premýšľať nad tým, prečo je to tak a možno vás aj napadne, či náhodou so systémom nie je niečo v neporiadku.Zákazy z hľadiska jednotlivých znakov a názvov platia pre súbory a takisto priečinky. Priečinok, je totiž v rámci súborového systému NTFS či FAT takisto len súbor, ktorý má len trochu odlišné atribúty a neobsahuje okrem nich žiadne interné dáta. Z hľadiska názvov je pri tom jedno, či použijete veľké alebo malé písmená, pretože Windows medzi nimi v rámci názvoslovia nerozlišuje (na rozdiel od Linuxu).

Limity v rámci názvoslovia má pravdaže každý súborový a operačný systém a Windows v tomto nijako nevyčnieva z radu. Iné systémy však majú obmedzenia mierne odlišné, pričom hlavne v počiatkoch osobných počítačov vedeli byť aj poriadne limitujúce. Napríklad MS-DOS mal v rámci FAT dobre známe obmedzenie, známe ako 8.3, ktoré znemožňovalo použiť názov dlhší ako osem znakov a väčšiu ako trojznakovú príponu za bodkou.

Čo je na daných znakoch do čerta také špeciálne?

V rámci Windows nemôžete pri pomenovaní súborov a priečinkov použiť nasledovné znaky:

/ (lomka)
\ (spätná lomka)
: (dvojbodka)
< (menej ako)
> (viac ako)
“ (úvodzovka)
? (otáznik)
* (hviezdička)
| (zvislá čiara)

Prečo sú to ale práve tieto? Čo je na týchto interpunkčných znamienkach také zvláštne? Veď predsa interpunkčné znamienka ako je výkričník alebo pomlčka sa dajú v menách použiť normálne, tak prečo nie aj otáznik, lomka či hviezdička?

Rýchla odpoveď: Windows tieto znaky používa v rámci vlastného názvoslovia a súborovej hierarchie. V názvoch ich preto nemožno použiť preto, aby s nimi nekolidovali. Je to podobné, ako keby ste pomenovali svoju dcéru menom „syn“. V takomto prípade by bolo veľmi problematický rozlíšiť, kedy hovoríte naozaj o svojom synovi a kedy o svojej dcére.

Chcem vedieť, prečo je to tak: Aby sme pochopili prečo je to tak, začnime niečím jednoduchým. Prečo nemôže nejaký svoj priečinok nazvať C: ? Jednoducho preto, že toto názvoslovie používa Windows v rámci svojho súborového systému na pomenovanie jednotiek a adries. Ak máme priečinok na diskovej partícii C:, nazvaný Moje Dokumenty, jeho adresa je C:/Moje Dokumenty. Ak by sme v ňom vytvorili priečinok s takýmto názvom, jeho cesta by bola C:/Moje Dokumenty/C:, čo vyzerá ako jasný konflikt a problém.

Z rovnakého dôvodu nie je možné používať v názve priečinkov lomky, pretože aj tie sa používajú na popis adresy. Ak by ste mali priečinok pomenovaný „Moje/Súbory“, Windows by nemal ako rozlíšiť medzi ním a priečinkom Moje, obsahujúcim podpriečinok Súbory. Oba by totiž mali rovnakú adresu, ktorá by bola napríklad C:/Moje/Subory. Klasickú a obrátenú lomku je možné vo Windows pri zápise adresy zamieňať, takže pre ňú platí totožná vec.

Dobre teda. Týmto očividne vylučujeme znaky /  \ : a je jasné, prečo ich nemožno používať. Čo ale ostatné? Veď otáznik, hviezdička či úvodzovky sa v adresách nevyskytujú.

V ich prípade ide o tzv. Wildcard znaky, teda v doslovnom preklade divoké či žolíkové znaky, ktoré majú v rámci systému špecifický význam. Vhodný preklad tohto anglického výrazu je „zástupné znaky“, pričom sa používajú pri definíciách či vyhľadávaní rôznych súborov.

Windows teda zabraňuje používaniu týchto znakov v názvoch z dôvodu, že ich používa ako zástupné pri súhrnnom zápise rôznych reťazcov. Hviezdička sa používa ako náhrada ľubovoľného počtu písmen alebo čísiel, zatiaľ čo otáznik ako náhrada jedného znaku.

Ak napríklad zadáte hľadanie súboru *.DOCX, Windows vám poskytne všetky súbory s touto príponou a s ľubovoľným menom. Ak vyhľadávate súbory *TATRY*.JPG, nájdu sa všetky JPG s názvom, ktorý tatry obsahuje, pričom je jedno, či ide o súbor 72TatryMoje.JPG, alebo tatry-matry.JPG. Ak použijete otáznik a zadáte TATRY?.JPG, nájdete súbory ako tatry2.jpg alebo tatryk.jpg, ale už nie mojetatry.jpg či tatry79.jpg.

Podobné pravidlá platia nielen pri vyhľadávaní, ale aj pri iných operáciách so súbormi, napríklad v rámci príkazov dávkových súborov. Na začiatku sme spomenuli starší limit názvoslovia DOS, ktorý mohol používať maximálne 8 znakov dlhé názvy a tri znaky dlhé prípony (limit 8.3). Nespomenuli sme to náhodne, pretože Windows stále obsahuje aj „žolíkové znaky“ tohto názvoslovia, pre zachovanie spätnej kompatibility.

Znak < nahrádza podobne ako hviezdička nula alebo viac znakov, avšak len v rámci MS-DOS menového priestoru. Znak > naopak zastupuje len jeden znak, podobne ako otáznik, avšak takisto iba v rámci MS-DOS názvov. No a napokon úvodzovka v rámci MS-DOS sémantiky zodpovedá bodke alebo žiadnemu znaku za názvom.

Z tohto dôvodu teda Windows znaky * ? < > “ nepovoľuje priamo v názvoch, aby s týmito žolíkovými znakmi nekolidovali.

Zostal nám však ešte jeden znak, ktorým je zvislá čiara, tiež nazývaná ako rúrka (pipe). Tá nie je používaná v adresách, ani v rámci žolíkových znakov. Je však rezervovaná pre presmerovanie programov alebo príkazov z jedného na druhý.

V rámci príkazového riadku ide o zápis Príkaz1 | Príkaz2, ktorý umožňuje zreťazenie (pipeline), takže DOS a rovnako aj jeho nástupca v podobe Windows tento znak pri pomenovaní nepovoľujú.

Prečo ale do pekla nie je možné použiť niektoré názvy?

Ak dôvod nemožnosti používania niektorých znakov už chápete, celkom určite vám ešte vŕta v hlave, prečo nie je možné použiť niektoré názvy, skladajúce sa z bežných písmen.

V rámci Windows ide o názvy CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 a LPT9. Ako sme už spomenuli, použitie malých alebo veľkých písmen je irelevantné a v názvoch považované za totožné.

Rýchla odpoveď: Ide o virtuálne názvy súborov/priečinkov, ktoré sa používajú od dôb MS-DOS (pokrvný predchodca Windows) na priamy výstup alebo vstup dát z počítača namiesto ich lokálneho uloženia. Nemožno ich preto použiť pre názov bežného súboru, pretože Windows stále obsahuje mechanizmus na pôvodnú reakciu.

Chcem vedieť, prečo je to tak: Zdanlivo neškodné názvy  CON, PRN, NUL, AUX, COM1 až COM9 a LPT1 až LPT9 nie sú vo Windows zakázané úplne. Tieto názvy sú povolené, avšak len v rámci špecifických úloh.

Pozrime sa najprv na názov CON. Tento priečinok, alebo súbor nie je možné vytvoriť z dôvodu, že ide o niekdajší súborový príkaz MS-DOS, v súčasnosti prenesený do názvoslovia Príkazového riadku. Ide o skrátenie výrazu Console (konzola), respektíve použitie prvých troch písmen tohto slova. Príkaz umožňoval a doteraz aj umožňuje vziať obsah súboru a odoslať ho do konzoly.

Ak máte napríklad textový súbor nazvaný subor.txt na disku D: a v rámci Príkazového riadku napíšete jeho názov a stlačíte Enter, súbor sa klasicky otvorí v rámci Windows. Príkazom COPY subor.txt CON ho však môžete otvoriť a skopírovať jeho obsah priamo do konzoly.

Takéto niečo by pravdaže nebolo možné vykonať, ak by sa konkrétny súbor alebo priečinok volal CON. Podobne ako v prípade s lomkou alebo písmenom a dvojbodkou by došlo ku konfliktu, tentoraz k rozporu s používaným operátorom.

Všetko to má počiatky v operačnom systéme DOS, ktorý v dobe svojho vytvorenia pre 16-bitové procesory preberal mnohé funkcie dovtedy populárneho operačného systému CP/M pre 8-bitové CPU.

V týchto systémoch existovalo niečo ako „magické súbory“, ktoré sa uplatňovali pri niektorých konkrétnych úlohách.

Predstavte si napríklad, že ste na počítači písali dokument a následne ste si ho chceli rovno vytlačiť na tlačiarni. Dnes nad tým pravdaže nepremýšľame a súbor si ukladáme aj na disk (respektíve program to vykoná za nás), ale v prehistorickej dobe počítačov a operačných systémov bolo takéto správanie márnivé.

Na uloženie súboru totiž na vašom jedinom úložisku = diskete, vtedy v obvyklej kapacite 160 kB, nemuselo byť vôbec miesto (pevné disky či iné vysokokapacitné úložiská sa ešte na počítačoch nepoužívali). Súbor ste teda mohli virtuálne „uložiť“ s názvom PRN.

Systém tento názov rozpoznal ako magický a namiesto vytvorenia súboru na diskete dáta poslal rovno do tlačiarne. Ak ste napísaný obsah chceli z obrazovky zmazať, použili ste magický názov súboru NUL, čo znamenalo, že namiesto uloženia sa dáta na obrazovke a v operačnej pamäti zmazali.

Tieto metódy v základe umožňovali softvéru interagovať s ovládačmi hardvéru priamo pomocou jednoduchých vstupno-výstupných volaní, čo šetrilo prostriedky aj miesto.

Ako sa MS-DOS postupne vyvíjal, tieto pravidlá si uchovával. Postupne dostal DOS grafickú nadstavbu v podobe Windows, ktorá bola naň najprv len naviazaná, ale napokon rolu operačného systému celkom prevzala, pochovávajúc celý DOS. Jeho historické bremeno si však z dôvodu neustáleho zachovávania spätnej kompatibility nové verzie Windows postupne predávali ako štafetu.

CON, PRN a NUL sa však stále dodnes aktívne používajú, napríklad pri tvorbe dávkových súborov, takže ich význam nekončí.

To sa už obvykle nedá povedať o ich ďalších troch bračekoch v podobe AUX, COM a LPT. Tieto rezervované názvy sa používali ku priamej komunikácii s portami v podobe prídavných (auxiliary), sériových a paralelných portov.

Ak ste chceli v rámci DOS odosielať súbor do komunikačného paralelného portu, ku ktorému ste mali pripojené nejaké zariadenie, mohli ste „vytvárať“ priečinok COM1 v rámci funkcie CreateFile, ktoré dáta do portu odoslalo. Rezervované boli a dodnes sú číselné hodnoty COM1 až COM9, i keď počítače obvykle viac ako dva tieto porty nemali.

V prípade paralelných portov šlo o LPT až LPT9 a v prípade AUX, ktorý bol obvykle reprezentovaný zvukovým jackom, bolo rezervované vždy len jedno označenie.

Používanie sériových a paralelných portov je dnes už vecou len historického hardvéru a väčšina používateľov už dnes vôbec netuší, ako ich konektory a káble vlastne vyzerajú. Koniec koncov, nie je sa čomu čudovať. Ich pozíciu prebralo už pred 20 rokmi modernejšie a omnoho flexibilnejšie rozhranie USB.

Ako sme už naznačili. Tieto pravidlá názvov magických súborov nie sú nedotknuteľné a v rámci Windows je ich možné určitými spôsobmi obísť. Slúži na to prefix \\.\, ktorý tento limit vyradí. Ak by ste teda niekedy nutne priečinky s týmito názvami potrebovali vytvoriť (napríklad na adrese D:/Moj priečinok/CON), je možné použiť Príkazový riadok a zadať do neho príkaz md \\.\D:\Dokumenty\CON.

Priečinok sa vytvorí, avšak výsledkom bude značne neštandardné správania systému. Programy, ktoré nevyžadujú na prístup do priečinkov asistenciu rozhrania Windows, ho budú môcť používať, ale v rámci Prieskumníka tento priečinok nebudete môcť otvárať a dokonca ani zmazať. Pre jeho odstránenie bude nutné opäť použiť konzolu (v príkaze je namiesto md potrebné použiť príkaz rmdir).

Vo výsledku je teda snaha o obchádzanie týchto limitov nepraktická a otravná. Windows skrátka stále myslí aj „magicky“, tak ako jeho predchodca a v najbližšej dobe nemožno očakávať v tomto smere nejakú zmenu.

František Urban

František Urban
Zameriavam sa najmä na prehľadové a analytické články z oblasti najrôznejších technológií a ich vývoja. Nájdete ma takisto pri diagnostike HW a SW problémov.