Delen via


Naamgeving van bestanden, paden en naamruimten

De bestandssystemen die door Windows worden ondersteund, gebruiken het concept van bestanden en mappen voor toegang tot gegevens die zijn opgeslagen op een schijf of apparaat. Windows-ontwikkelaars die met de Windows-API's werken voor I/O voor bestanden en apparaten, moeten de regels, conventies en beperkingen van namen voor bestanden en mappen begrijpen.

Gegevens kunnen worden geopend vanaf schijven, apparaten en netwerkshares met behulp van I/O-API's van bestanden. Bestanden en mappen, samen met naamruimten, maken deel uit van het concept van een pad. Dit is een tekenreeksweergave van waar de gegevens moeten worden opgehaald, ongeacht of deze afkomstig zijn van een schijf of een apparaat of een netwerkverbinding voor een specifieke bewerking.

Sommige bestandssystemen, zoals NTFS, ondersteunen gekoppelde bestanden en mappen, die ook de naamconventies en regels voor bestandsnamen volgen, net zoals een gewoon bestand of map. Zie voor meer informatie harde koppelingen en verbindingen en reparsepunten en bestandsbewerkingen.

Zie Maximale padlengtebeperkingvoor meer informatie over het configureren van Windows om lange bestandspaden te ondersteunen.

Bestands- en directorynamen

Alle bestandssystemen volgen dezelfde algemene naamconventies voor een afzonderlijk bestand: een basisbestandsnaam en een optionele extensie, gescheiden door een punt. Elk bestandssysteem, zoals NTFS, CDFS, exFAT, UDFS, FAT en FAT32, kan echter specifieke en verschillende regels hebben over de vorming van de afzonderlijke onderdelen in het pad naar een map of bestand. Houd er rekening mee dat een map gewoon een bestand is met een speciaal kenmerk dat het als map aangeeft, maar anders dezelfde naamgevingsregels moet volgen als een normaal bestand. Omdat de term map alleen verwijst naar een speciaal type bestand wat het bestandssysteem betreft, wordt in sommige referentiemateriaal de algemene term bestand gebruikt om zowel de concepten van mappen als gegevensbestanden als dergelijke te omvatten. Daarom moeten alle naamgevings- of gebruiksregels of voorbeelden voor een bestand ook van toepassing zijn op een map, tenzij anders opgegeven. De term pad verwijst naar een of meer mappen, backslashes en mogelijk een volumenaam. Zie de sectie Paden voor meer informatie.

Beperkingen voor het aantal tekens kunnen ook verschillen en kunnen variëren, afhankelijk van de indeling van het bestandssysteem en het padnaamvoorvoegsel dat wordt gebruikt. Dit wordt verder gecompliceerd door ondersteuning voor achterwaartse compatibiliteitsmechanismen. De oudere MS-DOS FAT-bestandssysteem ondersteunt bijvoorbeeld maximaal 8 tekens voor de basisbestandsnaam en 3 tekens voor de extensie, voor in totaal 12 tekens, inclusief het puntscheidingsteken. Dit wordt meestal een 8.3-bestandsnaamgenoemd. De Windows FAT- en NTFS-bestandssystemen zijn niet beperkt tot 8.3-bestandsnamen, omdat ze lange bestandsnaam ondersteunen, maar ze ondersteunen nog steeds de 8.3-versie van lange bestandsnamen.

Naamgevingsconventies

Met de volgende fundamentele regels kunnen toepassingen geldige namen voor bestanden en mappen maken en verwerken, ongeacht het bestandssysteem:

  • Gebruik een punt om de basisbestandsnaam te scheiden van de extensie in de naam van een map of bestand.

  • Gebruik een backslash (\) om de onderdelen te scheiden van een pad. De backslash verdeelt de bestandsnaam van het pad ernaartoe, en de ene directorynaam van een andere directorynaam in een pad. U kunt geen backslash gebruiken in de naam voor het werkelijke bestand of de werkelijke map, omdat het een gereserveerd teken is dat de namen scheidt in onderdelen.

  • Gebruik een backslash zoals vereist als onderdeel van volumenamen, bijvoorbeeld de "C:\" in "C:\path\file" of de "\\server\share" in "\\server\share\path\file" voor UNC-namen (Universal Naming Convention). Zie de sectie Maximale padlengtebeperking voor meer informatie over UNC-namen.

  • Ga niet uit van hoofdlettergevoeligheid. Denk bijvoorbeeld aan de namen OSCAR, Oscar en oscar als dezelfde te beschouwen, zelfs als sommige bestandssystemen (zoals een POSIX-compatibel bestandssysteem) ze als verschillend beschouwen. NTFS ondersteunt POSIX-semantiek voor hoofdlettergevoeligheid, maar dit is niet het standaardgedrag. Zie CreateFilevoor meer informatie.

  • Volumeaanduidingen (stationletters) zijn niet-hoofdlettergevoelig. 'D:\' en 'd:\' verwijzen bijvoorbeeld naar hetzelfde volume.

  • Gebruik elk teken op de huidige codepagina voor een naam, inclusief Unicode-tekens en -tekens in de uitgebreide tekenset (128-255), met uitzondering van het volgende:

    • De volgende gereserveerde tekens:

      • < (kleiner dan)
      • > (groter dan)
      • : (dubbele punt)
      • " (dubbele aanhalingsteken)
      • / (schuine streep naar voren)
      • \ (backslash)
      • | (pijpteken of pipe)
      • ? (vraagteken)
      • * (sterretje)
    • Geheel getal nul, soms aangeduid als het ASCII-NUL- teken.

    • Tekens waarvan de gehele getallen zich in het bereik bevinden van 1 tot en met 31, met uitzondering van alternatieve gegevensstromen waarin deze tekens zijn toegestaan. Zie Bestandsstreamsvoor meer informatie over bestandsstromen.

    • Elk ander teken dat het doelbestandssysteem niet toestaat.

  • Gebruik een punt als map onderdeel in een pad om de huidige map weer te geven, bijvoorbeeld '.\temp.txt". Zie Padenvoor meer informatie.

  • Gebruik twee opeenvolgende punten (..) als map onderdeel in een pad om het bovenliggende item van de huidige map weer te geven, bijvoorbeeld ..\temp.txt". Zie Padenvoor meer informatie.

  • Gebruik niet de volgende gereserveerde namen voor de naam van een bestand:

    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² en LPT³. Vermijd deze namen ook onmiddellijk gevolgd door een extensie; Zo zijn NUL.txt en NUL.tar.gz beide gelijk aan NUL. Zie naamruimtenvoor meer informatie.

    Notitie

    Windows herkent de 8-bits ISO/IEC 8859-1 superscript digits ¹, ² en ³ als cijfers en behandelt ze als geldige onderdelen van COM#- en LPT#-apparaatnamen, waardoor ze in elke map gereserveerd zijn. echo test > COM¹ kan bijvoorbeeld geen bestand maken.

  • Beëindig geen bestands- of mapnaam met een spatie of een punt. Hoewel het onderliggende bestandssysteem dergelijke namen mogelijk ondersteunt, doet de Windows-shell en de gebruikersinterface dit niet. Het is echter acceptabel om een punt op te geven als het eerste teken van een naam. Bijvoorbeeld .temp.

Korte versus lange namen

Een lange bestandsnaam wordt beschouwd als een bestandsnaam die groter is dan de korte MS-DOS (ook wel 8.3genoemd) stijlnaamconventie. Wanneer u een lange bestandsnaam maakt, kan Windows ook een korte 8.3-vorm van de naam maken, de zogenaamde alias 8.3 of korte naam, en deze ook opslaan op schijf. Deze 8.3-aliasing kan worden uitgeschakeld om prestatieredenen, zowel systeembreed als voor een opgegeven volume, afhankelijk van het specifieke bestandssysteem.

Windows Server 2008, Windows Vista, Windows Server 2003 en Windows XP: 8.3 aliasing kan niet worden uitgeschakeld voor opgegeven volumes tot Windows 7 en Windows Server 2008 R2.

Op veel bestandssystemen bevat een bestandsnaam een tilde (~) binnen elk onderdeel van de naam die te lang is om te voldoen aan 8.3-naamgevingsregels.

Notitie

Niet alle bestandssystemen volgen de tilde-vervangingsconventie en systemen kunnen worden geconfigureerd om het genereren van aliassen van 8.3 uit te schakelen, zelfs als ze deze normaal ondersteunen. Maak daarom niet de aanname dat de alias 8.3 al op schijf bestaat.

Als u 8.3-bestandsnamen, lange bestandsnamen of het volledige pad van een bestand van het systeem wilt aanvragen, kunt u de volgende opties overwegen:

  • Als u de 8.3-vorm van een lange bestandsnaam wilt ophalen, gebruikt u de functie GetShortPathName.
  • Als u de lange bestandsnaamversie van een korte naam wilt ophalen, gebruikt u de functie GetLongPathName.
  • Als u het volledige pad naar een bestand wilt ophalen, gebruikt u de functie GetFullPathName.

Op nieuwere bestandssystemen, zoals NTFS, exFAT, UDFS en FAT32, worden de lange bestandsnamen opgeslagen op schijf in Unicode, wat betekent dat de oorspronkelijke lange bestandsnaam altijd behouden blijft. Dit geldt zelfs als een lange bestandsnaam uitgebreide tekens bevat, ongeacht de codepagina die actief is tijdens een lees- of schrijfbewerking van een schijf.

Bestanden met lange bestandsnamen kunnen worden gekopieerd tussen NTFS-bestandssysteempartities en Windows FAT-bestandssysteempartities zonder verlies van bestandsnaaminformatie. Dit geldt mogelijk niet voor de oudere MS-DOS FAT en sommige typen CDFS-bestandssystemen (CD-ROM) afhankelijk van de werkelijke bestandsnaam. In dit geval wordt de korte bestandsnaam indien mogelijk vervangen.

Paden

Het pad naar een opgegeven bestand bestaat uit een of meer onderdelen, gescheiden door een speciaal teken (een backslash), waarbij elk onderdeel meestal een mapnaam of bestandsnaam is, maar met enkele opmerkelijke uitzonderingen die hieronder worden besproken. Het is vaak van cruciaal belang voor de interpretatie van het systeem van een pad hoe het begin, of voorvoegsel, van het pad eruitziet. Dit voorvoegsel bepaalt de naamruimte het pad gebruikt en daarnaast welke speciale tekens worden gebruikt in welke positie binnen het pad, inclusief het laatste teken.

Als een onderdeel van een pad een bestandsnaam is, moet dit het laatste onderdeel zijn.

Elk onderdeel van een pad wordt ook beperkt door de maximale lengte die is opgegeven voor een bepaald bestandssysteem. Over het algemeen zijn deze regels onderverdeeld in twee categorieën: korte en lange. Houd er rekening mee dat mapnamen door het bestandssysteem worden opgeslagen als een speciaal type bestand, maar naamgevingsregels voor bestanden zijn ook van toepassing op mapnamen. Samenvattend is een pad simpelweg de tekenreeksweergave van de hiërarchie tussen alle mappen die bestaan voor een bepaald bestand of een bepaalde mapnaam.

Volledig gekwalificeerde versus relatieve paden

Voor Windows API-functies die bestanden bewerken, kunnen bestandsnamen vaak relatief zijn ten opzichte van de huidige map, terwijl sommige API's een volledig gekwalificeerd pad vereisen. Een bestandsnaam is relatief ten opzichte van de huidige map als deze niet begint met een van de volgende:

  • Een UNC-naam in elk formaat, die altijd begint met twee backslashtekens ("\\"). Zie de volgende sectie voor meer informatie.
  • Een schijfaanduiding met een backslash, bijvoorbeeld "C:\" of "D:\".
  • Eén backslash, bijvoorbeeld "\directory" of "\file.txt". Dit wordt ook wel een absoluut padgenoemd.

Als een bestandsnaam begint met alleen een schijfletter, maar niet de backslash na de dubbele punt, wordt deze geïnterpreteerd als een relatief pad naar de huidige map op het station met de opgegeven letter. Houd er rekening mee dat de huidige map al dan niet de hoofdmap is, afhankelijk van waarop deze is ingesteld tijdens de meest recente bewerking map wijzigen op die schijf. Voorbeelden van deze indeling zijn als volgt:

  • "C:tmp.txt" verwijst naar een bestand met de naam "tmp.txt" in de huidige map op station C.
  • "C:tempdir\tmp.txt" verwijst naar een bestand in een submap binnen de huidige map op station C.

Er wordt ook gezegd dat een pad relatief is als het 'dubbele stippen' bevat; dat wil gezegd: twee perioden samen in één onderdeel van het pad. Deze speciale aanduiding wordt gebruikt om de map boven de huidige map aan te geven, ook wel de bovenliggende map genoemd. Voorbeelden van deze indeling zijn als volgt:

  • "..\tmp.txt" specificeert een bestand met de naam tmp.txt dat zich bevindt in de bovenliggende map van de huidige map."
  • "..\..\tmp.txt" geeft een bestand op dat twee mappen boven de huidige map is.
  • "..\tempdir\tmp.txt" specificeert een bestand met de naam tmp.txt dat zich in een map bevindt genaamd tempdir, welke een zijmap is van de huidige map.

Relatieve paden kunnen beide voorbeeldtypen combineren, bijvoorbeeld 'C:..\tmp.txt". Dit is handig omdat, hoewel het systeem de huidige schijf samen met de huidige map van die schijf bijhoudt, het ook de huidige mappen in elk van de verschillende schijfletters bijhoudt (als uw systeem er meer dan één heeft), ongeacht welke schijfletter is ingesteld als de huidige schijf.

Limiet op de maximale lengte van het pad

In edities van Windows vóór Windows 10 versie 1607 is de maximale lengte voor een pad MAX_PATH, die is gedefinieerd als 260 tekens. In latere versies van Windows is het wijzigen van een registersleutel of het hulpprogramma Groepsbeleid vereist om de limiet te verwijderen. Zie maximale padlengtebeperking voor meer informatie.

Naamruimten

Er zijn twee hoofdcategorieën van naamruimteconventies die worden gebruikt in de Windows-API's, meestal aangeduid als NT-naamruimten en de Win32-naamruimten. De NT-naamruimte is ontworpen als de naamruimte op het laagste niveau waarop andere subsystemen en naamruimten kunnen bestaan, waaronder het Win32-subsysteem en, extensie, de Win32-naamruimten. POSIX is een ander voorbeeld van een subsysteem in Windows dat is gebouwd boven op de NT-naamruimte. Vroege versies van Windows hebben ook verschillende vooraf gedefinieerde of gereserveerde namen gedefinieerd voor bepaalde speciale apparaten, zoals communicatiepoorten (seriële en parallelle) poorten en de standaardweergaveconsole als onderdeel van de naamruimte van het NT-apparaat en worden nog steeds ondersteund in de huidige versies van Windows voor achterwaartse compatibiliteit.

Win32-bestandsnaamruimten

De win32-naamruimtevoorvoegsels en conventies worden samengevat in deze sectie en de volgende sectie, met beschrijvingen van hoe ze worden gebruikt. Houd er rekening mee dat deze voorbeelden zijn bedoeld voor gebruik met de Windows API-functies en niet allemaal noodzakelijkerwijs werken met Windows Shell-toepassingen zoals Windows Verkenner. Daarom is er een breder scala aan mogelijke paden dan meestal beschikbaar is vanuit Windows Shell-toepassingen en Windows-toepassingen die hiervan profiteren, kunnen worden ontwikkeld met behulp van deze naamruimteconventies.

Voor bestands-I/O geeft het voorvoegsel \\?\" aan een padtekenreeks aan dat de Windows-API's alle tekenreeksparsering uitschakelen en de tekenreeks die volgt, rechtstreeks naar het bestandssysteem verzenden. Als het bestandssysteem bijvoorbeeld grote paden en bestandsnamen ondersteunt, kunt u de MAX_PATH limieten overschrijden die anders worden afgedwongen door de Windows-API's.

Omdat automatische uitbreiding van de padtekenreeks wordt uitgeschakeld, staat het voorvoegsel \\?\ ook het gebruik van '..' en '.' in de padnamen toe. Dit kan handig zijn als u bewerkingen probeert uit te voeren op een bestand met deze anders gereserveerde relatieve padaanduidingen als onderdeel van het volledige pad.

Veel, maar niet alle file-I/O-API's ondersteunen "\\?\\". Bekijk de documentatiepagina voor elke API om hier zeker van te zijn.

Houd er rekening mee dat Unicode-API's moeten worden gebruikt om ervoor te zorgen dat het voorvoegsel '\\?\' het MAX_PATHoverschrijdt.

Win32-apparaatnaamruimten

Het voorvoegsel \\.\krijgt toegang tot de Win32-apparaatnaamruimte in plaats van de Win32-bestandsnaamruimte. Dit is hoe de toegang tot fysieke schijven en volumes rechtstreeks wordt uitgevoerd, zonder het bestandssysteem te doorlopen, als de API dit type toegang ondersteunt. U hebt op deze manier toegang tot veel andere apparaten dan schijven (bijvoorbeeld met behulp van de functies CreateFile en DefineDosDevice).

Als u bijvoorbeeld de seriële communicatiepoort 1 van het systeem wilt openen, kunt u COM1 gebruiken in de aanroep naar de functie CreateFile. Dit werkt omdat COM1-COM9 deel uitmaakt van de gereserveerde namen in de NT-naamruimte, hoewel het gebruik van het voorvoegsel \\.\ook met deze apparaatnamen werkt. Ter vergelijking: als u een seriële uitbreidingskaart van 100 poorten hebt geïnstalleerd en COM56 wilt openen, kunt u het niet openen met COM56 omdat er geen vooraf gedefinieerde NT-naamruimte voor COM56 is. U moet het openen met behulp van \\.\COM56, omdat \\.\" rechtstreeks naar de naamruimte van het apparaat gaat zonder een vooraf gedefinieerde alias te zoeken.

Een ander voorbeeld van het gebruik van de Win32-apparaatnaamruimte is het gebruik van de functie CreateFile met \.\PhysicalDriveX(waarbij X- een geldig geheel getal is) of '\.\CdRomX'. Hierdoor hebt u rechtstreeks toegang tot deze apparaten, waardoor het bestandssysteem wordt overgeslagen. Dit werkt omdat deze apparaatnamen door het systeem worden gemaakt omdat deze apparaten worden geïnventariseerd en sommige stuurprogramma's ook andere aliassen in het systeem maken. Het apparaatstuurprogramma dat bijvoorbeeld de naam C:\implementeert, heeft een eigen naamruimte die ook het bestandssysteem is.

API's die de functie CreateFile doorlopen, werken doorgaans met het voorvoegsel \\.\, omdat CreateFile- de functie is die wordt gebruikt om zowel bestanden als apparaten te openen, afhankelijk van de parameters die u gebruikt.

Als u met Windows API-functies werkt, moet u het voorvoegsel \\.\gebruiken om alleen toegang te krijgen tot apparaten en niet tot bestanden.

De meeste API's bieden geen ondersteuning voor \\.\; alleen degenen die zijn ontworpen om met de apparaatnaamruimte te werken, herkennen deze. Controleer altijd het naslagonderwerp voor elke API om er zeker van te zijn.

NT-naamruimten

Er zijn ook API's die het gebruik van de NT-naamruimteconventie toestaan, maar windows Objectbeheer maakt dat in de meeste gevallen overbodig. Ter illustratie is het handig om door de Windows-naamruimten in de systeemobjectbrowser te bladeren met behulp van het hulpprogramma Windows Sysinternals WinObj. Wanneer u dit hulpprogramma uitvoert, ziet u de NT-naamruimte die begint bij de hoofdmap, te herkennen aan "\". De submap met de naam Global?? is waar de Win32-naamruimte zich bevindt. Benoemde apparaatobjecten bevinden zich in de NT-naamruimte in de submap Apparaat. Hier kunt u ook Serial0 en Serial1 vinden, de apparaatobjecten die de eerste twee COM-poorten vertegenwoordigen als deze aanwezig zijn op uw systeem. Een apparaatobject dat een volume vertegenwoordigt, zou ongeveer 'HarddiskVolume1' zijn, hoewel het numerieke achtervoegsel kan variëren. De naam DR0 onder submap Harddisk0 is een voorbeeld van het apparaatobject dat een schijf vertegenwoordigt, enzovoort.

Om deze apparaatobjecten toegankelijk te maken voor Windows-toepassingen, maken de apparaatstuurprogramma's een symbolische koppeling (symlink) in de Win32-naamruimte 'Globaal???', naar hun respectieve apparaatobjecten. COM0 en COM1 onder de submap Global??" zijn bijvoorbeeld gewoon symlinks naar Serial0 en Serial1, 'C:' is een symlink naar HarddiskVolume1, 'Physicaldrive0' is een symlink naar DR0, enzovoort. Zonder een symlink is een opgegeven apparaat Xxx niet beschikbaar voor een Windows-toepassing met behulp van Win32-naamruimteconventies, zoals eerder beschreven. Er kan echter een handle worden geopend voor dat apparaat met behulp van enige API's die het absolute pad naar de NT-naamruimte van het formaat '\Device\Xxx' ondersteunen.

Dankzij de toevoeging van ondersteuning voor meerdere gebruikers via Terminal Services en virtuele machines is het verder nodig om het systeembrede hoofdapparaat binnen de Win32-naamruimte te virtualiseren. Dit is bereikt door de symlink met de naam 'GLOBALROOT' toe te voegen aan de Win32-naamruimte, die u kunt zien in de submap 'Global???' van het WinObj-browserprogramma dat eerder is besproken en toegang heeft via het pad \\?\GLOBALROOT. Dit voorvoegsel zorgt ervoor dat het pad dat erop volgt kijkt naar het hoofdpad van de systeemobjectbeheerder en niet naar een sessieafhankelijk pad.

Zie ook