Fájlok, elérési utak és névterek elnevezése
A Windows által támogatott fájlrendszerek a fájlok és könyvtárak fogalmát használják a lemezen vagy eszközön tárolt adatok eléréséhez. A Windows API-kkal fájl- és eszköz I/O-val dolgozó Windows-fejlesztőknek ismerniük kell a fájlok és könyvtárak nevének szabályait, konvencióit és korlátozásait.
Az adatok lemezről, eszközről és hálózati megosztásról érhetők el fájl I/O API-k használatával. A fájlok és könyvtárak, valamint a névterek az elérési út fogalmának részét képezik, amely sztringben ábrázolja, hogy hol lehet lekérni az adatokat, függetlenül attól, hogy egy lemezről, egy eszközről vagy egy adott művelet hálózati kapcsolatáról van-e szó.
Egyes fájlrendszerek, például az NTFS, támogatják a csatolt fájlokat és könyvtárakat, amelyek ugyanúgy követik a fájlelnevezési konvenciók és szabályok betartását, mint egy normál fájl vagy könyvtár. További információkért lásd: Kemény linkek és csomópontok és Újraelemzési pontok és fájlműveletek.
A Windows hosszú fájlelérési utakat támogató konfigurálásáról a Maximális elérési úthossz-korlátozáscímű témakörben olvashat.
Fájl- és címtárnevek
Minden fájlrendszer ugyanazokat az általános elnevezési konvenciókat követi egy adott fájl esetében: egy alapfájlnevet és egy nem kötelező kiterjesztést, amelyet pont választ el egymástól. Azonban minden fájlrendszernek, például az NTFS, a CDFS, az exFAT, az UDFS, a FAT és a FAT32, külön és eltérő szabályai lehetnek a könyvtár vagy fájl elérési útjának egyes összetevőinek kialakítására vonatkozóan. Vegye figyelembe, hogy a könyvtár egyszerűen egy speciális attribútummal rendelkező fájl, amely címtárként jelöli ki, de máskülönben ugyanazokat az elnevezési szabályokat kell követnie, mint egy normál fájl. Mivel a könyvtár kifejezés egyszerűen egy speciális fájltípusra hivatkozik, ami a fájlrendszert illeti, egyes referenciaanyagok a fájl általános kifejezést használják a könyvtárak és az adatfájlok fogalmainak lefedésére. Emiatt , hacsak másként nem rendelkezik, a fájlok elnevezési vagy használati szabályainak vagy példáinak a könyvtárra is vonatkoznia kell. A elérési út kifejezés egy vagy több könyvtárra, fordított perjelre és esetleg kötetnévre utal. További információért lásd a Útvonalak szakaszt.
A karakterszám korlátozásai is eltérőek lehetnek, és a használt fájlrendszer- és elérésiút-névelőtag formátumától függően változhatnak. Ezt tovább bonyolítja a visszamenőleges kompatibilitási mechanizmusok támogatása. A régebbi MS-DOS FAT fájlrendszer például legfeljebb 8 karaktert támogat az alapfájlnévhez, a bővítményhez pedig 3 karaktert, összesen 12 karaktert, beleértve a pontelválasztót is. Ez a 8.3-as fájlnévnéven ismert. A Windows FAT- és NTFS fájlrendszerek nem korlátozódnak a 8.3 fájlnevekre, mert támogatják a hosszú fájlneveket , de továbbra is támogatják a hosszú fájlnevek 8.3-as verzióját.
Elnevezési egyezmények
Az alábbi alapvető szabályok lehetővé teszik az alkalmazások számára a fájlok és könyvtárak érvényes neveinek létrehozását és feldolgozását, függetlenül a fájlrendszertől:
Pont használatával válassza el az alapfájl nevét a bővítménytől egy könyvtár vagy fájl nevében.
Fordított perjel (\) használatával elválaszthatja a összetevőket egy elérési út. A fordított perjel elválasztja a fájlnevet az elérési úttól, és egy könyvtár nevét egy másik könyvtárnévtől az elérési úton. A tényleges fájl vagy könyvtár nevében nem használhat fordított perjelet, mert ez egy fenntartott karakter, amely összetevőkre bontja a neveket.
Szükség esetén használjon fordított perjelet kötetnevekrészeként, például a „C:\” a „C:\útvonal\fájl” vagy a „\\server\share” a „\\server\share\útvonal\fájl” UNC elnevezésű nevek esetén. Az UNC-nevekről további információt a Maximális elérési úthossz-korlátozás című szakaszban talál.
Ne feltételezze a kis- és nagybetűk érzékenységét. Tegyük fel például, hogy az OSCAR, az Oscar és az Oscar nevek azonosak, annak ellenére, hogy egyes fájlrendszerek (például a POSIX-kompatibilis fájlrendszerek) eltérőnek tekinthetik őket. Vegye figyelembe, hogy az NTFS támogatja a POSIX szemantikát a kis- és nagybetűk érzékenysége szempontjából, de nem ez az alapértelmezett viselkedés. További információ: CreateFile.
A kötetmegjelölők (meghajtóbetűjelek) hasonlóan nem érzékenyek a kis- és nagybetűkre. A "D:\" és a "d:\" például ugyanarra a kötetre hivatkozik.
Az aktuális kódlap bármely karakterét használhatja egy névhez, beleértve a Unicode-karaktereket és a kiterjesztett karakterkészletben szereplő karaktereket (128–255), kivéve az alábbiakat:
A következő fenntartott karakterek:
- < (kisebb mint)
- > (nagyobb, mint)
- : (kettőspont)
- " (dupla idézőjel)
- / (perjel)
- \ (visszaperjel)
- | (függőleges sáv vagy cső)
- ? (kérdőjel)
- * (csillag)
Nulla egész érték, amit néha ASCII NUL karakternek neveznek.
Azok a karakterek, amelyek egész száma 1 és 31 közötti tartományban van, kivéve azokat az alternatív adatfolyamokat, amelyekben ezek a karakterek engedélyezettek. További információ a fájlstreamekről: Fájlstreamek.
Bármely más karakter, amelyet a cél fájlrendszer nem engedélyez.
Használjon egy pontot könyvtárként összetevő az aktuális könyvtárat ábrázoló elérési úton, például ".\temp.txt". További információért lásd: Elérési utak.
Használja a két egymást követő pontot (..) egy elérési útvonalban az aktuális könyvtár szülőjének jelölésére, például "..\temp.txt" összetevőként. További információ: Útvonalak.
Ne használja a következő fenntartott neveket egy fájl nevére:
CON, PRN, AUX, NUL, COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, COM¹, COM², COM³, LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, LPT¹, LPT² és LPT³. Kerülje továbbá ezeket a neveket, amelyeket azonnal egy bővítmény követ; például NUL.txt és NUL.tar.gz egyenértékűek az NUL-nak. Az alábbi hivatkozásra kattintva további információt talál: Névterek.
Jegyzet
A Windows felismeri a 8 bites ISO/IEC 8859-1 ¹, ² és ³ felső indexű számjegyeket számjegyként, és a COM# és az LPT# eszköznevek érvényes részeiként kezeli őket, így minden könyvtárban fenntartottak. Például
echo test > COM¹
nem tud fájlt létrehozni.Ne fejezze be a fájl- vagy könyvtárnevet szóközzel vagy ponttal. Bár a mögöttes fájlrendszer támogatja az ilyen neveket, a Windows shell és a felhasználói felület nem. Elfogadható azonban, ha egy név első karaktereként egy pontot ad meg. Például: ".temp".
Rövid és hosszú nevek
A hosszú fájlnév minden olyan fájlnévnek minősül, amely túllépi a rövid MS-DOS (más néven 8.3) stíluselnevezési konvenciót. Ha hosszú fájlnevet hoz létre, a Windows a név egy rövid 8.3 formáját is létrehozhatja, amelyet 8.3 álneveként vagy rövid névként ismernek, és lemezen is tárolja. Az adott fájlrendszertől függően a 8.3-as címketömörítést teljesítménybeli okokból rendszer szinten vagy egy meghatározott kötet esetében lehet letiltani.
Windows Server 2008, Windows Vista, Windows Server 2003 és Windows XP: Az 8.3 aliasing csak a Windows 7 és a Windows Server 2008 R2 megjelenése után tiltható le a megadott köteteken.
Sok fájlrendszerben a fájlnév egy tilde (~) karaktert tartalmaz a név minden összetevőjén belül, amely túl hosszú ahhoz, hogy megfeleljen a 8.3 elnevezési szabályoknak.
Jegyzet
Nem minden fájlrendszer követi a tilde helyettesítési konvenciót, és a rendszerek konfigurálhatók úgy, hogy letiltják a 8.3 aliasgenerációt, még akkor is, ha általában támogatják azt. Ezért ne tegyük fel, hogy a 8.3 alias már létezik a lemezen.
Ha 8.3-fájlneveket, hosszú fájlneveket vagy egy fájl teljes elérési útját szeretné lekérni a rendszerből, vegye figyelembe az alábbi lehetőségeket:
- A hosszú fájlnév 8.3-os formájának lekéréséhez használja a GetShortPathName függvényt.
- A rövid név hosszú fájlnévverziójának lekéréséhez használja a GetLongPathName függvényt.
- Egy fájl teljes elérési útjának lekéréséhez használja a GetFullPathName függvényt.
Az újabb fájlrendszereken( például NTFS, exFAT, UDFS és FAT32) a Windows a hosszú fájlneveket Unicode-ban tárolja a lemezen, ami azt jelenti, hogy az eredeti hosszú fájlnév mindig megmarad. Ez akkor is igaz, ha egy hosszú fájlnév kiterjesztett karaktereket tartalmaz, függetlenül attól, hogy a kódlap aktív-e a lemez olvasási vagy írási művelete során.
A hosszú fájlneveket használó fájlok ntfs fájlrendszerpartíciók és Windows FAT fájlrendszerpartíciók között másolhatók anélkül, hogy a fájlnévadatok elvesznek. Ez nem feltétlenül igaz a régebbi MS-DOS FAT és bizonyos típusú CDFS (CD-ROM) fájlrendszerekre a tényleges fájlnévtől függően. Ebben az esetben lehetőség szerint a rövid fájlnév lesz helyettesítve.
Útvonalak
A megadott fájlhoz elérési út egy vagy több összetevőből, speciális karakterrel (fordított perjellel) elválasztva. Minden összetevő általában könyvtárnév vagy fájlnév, de néhány említendő kivételt az alábbiakban tárgyalunk. Gyakran kritikus fontosságú az elérési út rendszer általi értelmezése szempontjából, hogy az elérési út kezdete vagy előtagjahogyan néz ki. Ez az előtag határozza meg az elérési út névteret, valamint azt, hogy milyen speciális karaktereket használnak az elérési úton belüli pozícióban, beleértve az utolsó karaktert is.
Ha az elérési út egy összetevője fájlnév, akkor annak kell lennie az utolsó összetevőnek.
Az elérési út minden összetevőjét az adott fájlrendszerhez megadott maximális hossz is korlátozza. Ezek a szabályok általában két kategóriába sorolhatók: rövid és hosszú. Vegye figyelembe, hogy a címtárneveket a fájlrendszer speciális fájltípusként tárolja, de a fájlok elnevezési szabályai a címtárnevekre is érvényesek. Összefoglalva, az elérési út egyszerűen a hierarchia sztring-ábrázolása az adott fájl vagy könyvtárnév összes könyvtára között.
Teljes mértékben minősített és relatív elérési utak
A fájlokat kezelő Windows API-függvények esetében a fájlnevek gyakran az aktuális könyvtárhoz képest lehetnek megadva, míg egyes API-függvények teljes elérési utat igényelnek. A fájlnév az aktuális könyvtárhoz viszonyítva jelenik meg, ha nem az alábbiak egyikével kezdődik:
- Bármely formátum UNC-neve, amely mindig két fordított perjel karakterrel ("\\") kezdődik. További információkért lásd a következő szakaszt.
- Egy meghajtóbetűjel visszaperjellel, például "C:\" vagy "d:\".
- Egyetlen backslash, például "\directory" vagy "\file.txt". Ezt abszolút elérési útnak is nevezik.
Ha egy fájlnév csak egy lemezjelzővel kezdődik, de a kettőspont utáni fordított perjel nélkül, akkor azt relatív elérési útként értelmezi az aktuális könyvtárhoz a megadott betűjellel rendelkező meghajtón. Vegye figyelembe, hogy az aktuális könyvtár lehet vagy nem a gyökérkönyvtár attól függően, hogy a lemezen a legutóbbi "change directory" művelet során mire volt beállítva. Ilyen formátum például a következő:
- A "C:tmp.txt" egy "tmp.txt" nevű fájlra utal a C meghajtó aktuális könyvtárában.
- A "C:tempdir\tmp.txt" a C meghajtó aktuális könyvtárának alkönyvtárában lévő fájlra utal.
Az elérési út relatívnak is mondható, ha "kettős pontokat" tartalmaz; vagyis két pont együtt az elérési út egyik összetevőjében. Ez a speciális kijelölő az aktuális könyvtár feletti könyvtár, más néven a "szülőkönyvtár" jelölésére szolgál. Ilyen formátum például a következő:
- "..\tmp.txt" az aktuális könyvtár szülőjében található tmp.txt nevű fájlt adja meg.
- "..\..\tmp.txt" az aktuális könyvtár fölött két könyvtárat tartalmazó fájlt ad meg.
- "..\tempdir\tmp.txt" egy tmp.txt nevű fájlt határoz meg, amely egy tempdir nevű könyvtárban található, amely az aktuális könyvtár társkönyvtára.
A relatív elérési utak mindkét példatípust kombinálhatják, például "C:..\tmp.txt". Ez azért hasznos, mert bár a rendszer nyomon követi az aktuális meghajtót a meghajtó aktuális könyvtárával együtt, az aktuális könyvtárakat is nyomon követi az egyes meghajtóbetűjelekben (ha a rendszer egynél többel rendelkezik), függetlenül attól, hogy melyik meghajtótervező van beállítva aktuális meghajtóként.
Az elérési út maximális hosszának korlátozása
A Windows 10 1607-es verzió előtti kiadásaiban az elérési út maximális hossza MAX_PATH, amely 260 karakterből áll. A Windows későbbi verzióiban a korlát eltávolításához módosítani kell egy beállításkulcsot vagy a csoportházirend-eszközt. További részletekért lásd elérési út maximális hosszának korlátozását.
Névterek
A Windows API-kban a névtérkonvenciák két fő kategóriáját használják, amelyeket gyakran NT-névtereknek és Win32-névtereknek. Az NT-névtér a legalacsonyabb szintű névtér, amelyen más alrendszerek és névterek létezhetnek, beleértve a Win32 alrendszert és a Win32-névtereket is. A POSIX egy másik példa a Windows egy olyan alrendszerére, amely az NT-névtérre épül. A Windows korai verziói több előre definiált vagy fenntartott nevet is meghatároztak bizonyos speciális eszközökhöz, például a kommunikációs (soros és párhuzamos) portokhoz és az alapértelmezett megjelenítési konzolhoz az úgynevezett NT-eszköznévtér részeként, és továbbra is támogatottak a Windows jelenlegi verzióiban a visszamenőleges kompatibilitás érdekében.
Win32-fájlnévterek
A Win32 névtér előtagjai és konvenciók ebben a szakaszban és a következő szakaszban vannak összefoglalva, a használatuk leírásával. Vegye figyelembe, hogy ezek a példák a Windows API-függvényekkel való használatra szolgálnak, és nem feltétlenül működnek együtt a Windows rendszerhéj-alkalmazásokkal, például a Windows Intézővel. Ezért a windowsos rendszerhéj-alkalmazásokban általában elérhetőnél szélesebb a lehetséges útvonalak köre, és az ezt kihasználó Windows-alkalmazások ezen névtér-konvenciók használatával fejleszthetők.
Az I/O fájl esetében az elérési út sztringjének "\\?\" előtagja arra utasítja a Windows API-kat, hogy tiltsa le az összes sztring elemzését, és küldje el az azt követő sztringet közvetlenül a fájlrendszernek. Ha például a fájlrendszer támogatja a nagy elérési utakat és fájlneveket, túllépheti a Windows API-k által egyébként kikényszerített MAX_PATH korlátokat.
Mivel kikapcsolja az elérési út sztringjének automatikus kiterjesztését, a "\\?\" előtag lehetővé teszi a ".." és a "." használatát is az elérésiút-nevekben, ami hasznos lehet, ha olyan fájlokon próbál műveleteket végrehajtani, amelyek teljesen megadott útvonalként tartalmazzák ezeket az egyébként fenntartott relatív elérési utak jelölőit.
Sok, de nem minden fájl I/O API támogatja a "\\?\"; az egyes API-k referenciatémakörét kell áttekintenie, hogy biztos legyen benne.
Vegye figyelembe, hogy a Unicode API-k használatával győződjön meg arról, hogy a "\\?\" előtag lehetővé teszi, hogy túllépje a MAX_PATH.
Win32-eszköz névterek
A "\\.\" előtag a Win32-fájlnévtér helyett a Win32-eszköz névterét fogja elérni. Így érhető el közvetlenül a fizikai lemezekhez és kötetekhez való hozzáférés a fájlrendszeren való áthaladás nélkül, ha az API támogatja az ilyen típusú hozzáférést. A lemezeken kívül számos eszköz is elérhető így (például a CreateFile és DefineDosDevice függvény használatával).
Ha például meg szeretné nyitni a rendszer 1.soros kommunikációs portját, a "COM1" lehetőséget használhatja a CreateFile függvény hívásában. Ez azért működik, mert a COM1–COM9 az NT-névtér fenntartott neveinek része, bár a "\\.\" előtag használata is működni fog ezekkel az eszköznevekkel. Összehasonlításképpen, ha 100 port soros bővítőtáblája van telepítve, és meg szeretné nyitni a COM56-ot, nem nyitható meg a "COM56" használatával, mert nincs előre definiált NT-névtér a COM56-hoz. Meg kell nyitnia a "\\.\COM56" használatával, mert a "\\.\" közvetlenül az eszköz névterébe kerül anélkül, hogy megkísérli megkeresni az előre definiált aliast.
A Win32-eszköz névterének használatára egy másik példa a "\\.\PhysicalDriveX" CreateFile függvény használata (ahol X érvényes egész számérték) vagy "\\\.\CdRomX". Ez lehetővé teszi az eszközök közvetlen elérését, megkerülve a fájlrendszert. Ez azért működik, mert ezeket az eszközneveket a rendszer hozza létre, mivel ezeket az eszközöket számba veszi, és egyes illesztőprogramok más aliasokat is létrehoznak a rendszerben. A "C:\" nevet megvalósító eszközillesztőnek például saját névtere van, amely szintén a fájlrendszer.
Az CreateFile függvényen áthaladó API-k általában a "\\.\" előtaggal működnek, mivel CreateFile a fájlok és eszközök megnyitásához használt függvény a használt paraméterektől függően.
Ha Windows API-függvényekkel dolgozik, a "\\.\" előtaggal csak az eszközöket érheti el, a fájlokat nem.
A legtöbb API nem támogatja a "\\.\"; Csak azokat fogja felismerni, amelyek az eszköz névterével való együttműködésre lettek tervezve. Mindig ellenőrizze az egyes API-k referenciatémakörét.
NT-névterek
Vannak olyan API-k is, amelyek lehetővé teszik az NT-névtér-konvenciók használatát, de a Windows Object Manager ezt a legtöbb esetben szükségtelennek teszi. A szemléltetés érdekében hasznos a Windows-névterek tallózása a rendszerobjektum-böngészőben a Windows Sysinternals WinObj eszközzel. Amikor futtatja ezt az eszközt, az NT-névtér a gyökérnél indul, amelyet a "\" jelöl. A "Global??" nevű almappában található a Win32 névtér. Az elnevezett eszközobjektumok az NT-névtérben találhatók az "Eszköz" alkönyvtárban. Itt megtalálhatja a Serial0 és a Serial1 eszközt is, amely az első két COM-portot jelöli, ha az megtalálható a rendszeren. A kötetet képviselő eszközobjektum a "HarddiskVolume1" típushoz hasonló, bár a numerikus utótag eltérő lehet. A "Dr0" név a "Harddisk0" alkönyvtárban egy példa a lemezt képviselő eszközobjektumra, és így tovább.
Ha elérhetővé szeretné tenni ezeket az eszközobjektumokat a Windows-alkalmazások számára, az eszközillesztők létrehoznak egy szimbolikus hivatkozást (symlinket) a Win32 névtérben , "Globális??", a megfelelő eszközobjektumokra. Például a COM0 és a COM1 a "Globális??" alkönyvtárban egyszerűen szimlinkek a Serial0-hoz és a Soros1-hez, a "C:" a HarddiskVolume1 szimlinkje, a "Physicaldrive0" a DR0-hez való szimlink stb. Szimlink nélkül a megadott "Xxx" eszköz nem lesz elérhető a Korábban ismertetett Win32-névtér-konvenciók használatával bármely Windows-alkalmazás számára. Azonban egy fogantyú az eszközön megnyitható bármelyik API segítségével, amely támogatja az NT-névtér abszolút elérési útját a "\Device\Xxx" formátumban.
A terminálszolgáltatásokon és virtuális gépeken keresztüli többfelhasználós támogatás hozzáadásával szükségessé vált a rendszerszintű gyökéreszköz virtualizálása a Win32 névtérben. Ezt úgy tették meg, hogy hozzáadta a "GLOBALROOT" nevű symlinket a Win32 névtérhez, amelyet a Korábban tárgyalt WinObj böngésző eszköz "Global??" alkönyvtárában láthat, és a "\\\?\GLOBALROOT" elérési úton keresztül is hozzáférhet. Ez az előtag biztosítja, hogy az azt követő elérési út a rendszerobjektum-kezelő valódi gyökérútvonalában jelenik meg, nem pedig munkamenetfüggő elérési úton.