Maximale padlengtebeperking
In de Windows-API (met enkele uitzonderingen die in de volgende alinea's worden besproken), wordt de maximale lengte voor een pad MAX_PATH, die is gedefinieerd als 260 tekens. Een lokaal pad is gestructureerd in de volgende volgorde: stationsletter, dubbele punt, backslash, naamonderdelen gescheiden door backslashes en een afsluit null-teken. Het maximumpad op station D is bijvoorbeeld 'D:\tekenreeks van ongeveer 256 tekens<NUL->' waarbij '<NUL>' het onzichtbare afsluit-null-teken voor de huidige systeemcodepagina vertegenwoordigt. (De tekens <> worden hier gebruikt voor visuele duidelijkheid en kunnen geen deel uitmaken van een geldige padtekenreeks.)
U kunt deze beperking bijvoorbeeld bereiken als u een Git-opslagplaats kloont met lange bestandsnamen in een map die zelf een lange naam heeft.
Notitie
Bestands-I/O-functies in de Windows-API converteren '/' naar '\' als onderdeel van het converteren van de naam naar een NT-stijlnaam, met uitzondering van het voorvoegsel \\?\, zoals beschreven in de volgende secties.
De Windows-API heeft veel functies die ook Unicode-versies hebben om een pad met uitgebreide lengte toe te laten voor een maximale totale padlengte van 32.767 tekens. Dit type pad bestaat uit onderdelen gescheiden door backslashes, elk tot de waarde die wordt geretourneerd in de parameter lpMaximumComponentLength parameter van de functie GetVolumeInformation (deze waarde is meestal 255 tekens). Gebruik het voorvoegsel \\?\om een pad voor een lange lengte op te geven. Bijvoorbeeld '\\?\D:\zeer lang pad'.
Notitie
Het maximumpad van 32.767 tekens is bij benadering, omdat het voorvoegsel \\?\kan worden uitgebreid naar een langere tekenreeks door het systeem tijdens runtime. Deze uitbreiding is van toepassing op de totale lengte.
Het voorvoegsel \\?\kan ook worden gebruikt met paden die zijn samengesteld volgens de UNIVERSAL Naming Convention (UNC). Als u een dergelijk pad wilt opgeven met behulp van UNC, gebruikt u het voorvoegsel \\?\UNC\. Bijvoorbeeld '\\?\UNC\server\share', waarbij 'server' de naam van de computer is en 'share' de naam van de gedeelde map is. Deze voorvoegsels worden niet gebruikt als onderdeel van het pad zelf. Ze geven aan dat het pad met minimale aanpassingen moet worden doorgegeven aan het systeem, wat betekent dat u geen slashes kunt gebruiken om padscheidingstekens te vertegenwoordigen, of een punt om de huidige map weer te geven, of dubbele puntjes om de bovenliggende map weer te geven. Omdat u het voorvoegsel \\?\niet kunt gebruiken met een relatief pad, zijn relatieve paden altijd beperkt tot een totaal van MAX_PATH tekens.
U hoeft geen Unicode-normalisatie uit te voeren voor pad- en bestandsnaamtekenreeksen voor gebruik door de I/O-API-functies van het Windows-bestand, omdat het bestandssysteem pad- en bestandsnamen behandelt als een ondoorzichtige reeks van WCHAR-s. Elke normalisatie die uw toepassing vereist, moet worden uitgevoerd met dit in gedachten, extern van alle aanroepen naar gerelateerde I/O API-functies voor Windows-bestanden.
Wanneer u een API gebruikt om een map te maken, kan het opgegeven pad niet zo lang zijn dat u geen 8.3-bestandsnaam kunt toevoegen (dat wil gezegd, de mapnaam mag niet groter zijn dan MAX_PATH min 12).
De shell en het bestandssysteem hebben verschillende vereisten. Het is mogelijk om een pad te maken met de Windows-API dat de gebruikersinterface van de shell niet goed kan interpreteren.
Lange paden inschakelen in Windows 10, versie 1607 en hoger
Vanaf Windows 10 versie 1607 zijn MAX_PATH beperkingen verwijderd uit veel algemene Win32-bestands- en mapfuncties. Uw app moet zich echter aanmelden voor het nieuwe gedrag.
Als u het nieuwe gedrag voor lange paden per toepassing wilt inschakelen, moet aan twee voorwaarden worden voldaan. Er moet een registerwaarde worden ingesteld en het toepassingsmanifest moet het element longPathAware
bevatten.
Registerinstelling voor het inschakelen van lange paden
Belangrijk
Begrijpen dat het inschakelen van deze registerinstelling alleen van invloed is op toepassingen die zijn gewijzigd om te profiteren van de nieuwe functie. Ontwikkelaars moeten hun apps declareren om lang padbewust te zijn, zoals wordt beschreven in de manifestinstellingen van de toepassing hieronder. Dit is geen wijziging die van invloed is op alle toepassingen.
De registerwaarde HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)
moet bestaan en worden ingesteld op 1
. De registerwaarde wordt in de cache opgeslagen door het systeem (per proces) na de eerste aanroep van een betrokken Win32-bestand of mapfunctie (zie hieronder voor de lijst met functies). De registerwaarde wordt niet opnieuw geladen tijdens de levensduur van het proces. Om ervoor te zorgen dat alle apps op het systeem de waarde kunnen herkennen, is opnieuw opstarten mogelijk vereist omdat sommige processen mogelijk zijn gestart voordat de sleutel werd ingesteld.
U kunt deze code ook kopiƫren naar een .reg
-bestand dat dit voor u kan instellen, of de PowerShell-opdracht gebruiken vanuit een terminalvenster met verhoogde bevoegdheden:
- bestand Registry (.reg)
- PowerShell-
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
Notitie
Deze registerinstelling kan ook worden beheerd via Groepsbeleid op Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths
. Het beleid kan ook worden toegepast met Microsoft Intune met behulp van CSP -(Policy Configuration Service Provider).
Toepassingsmanifestupdates voor het declareren van mogelijkheden voor lang pad
Het toepassingsmanifest moet ook het longPathAware
-element bevatten.
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
<ws2:longPathAware>true</ws2:longPathAware>
</windowsSettings>
</application>
Functies zonder MAX_PATH beperkingen
Dit zijn de directorybeheerfuncties die niet langer MAX_PATH beperkingen hebben als u zich aanmeldt voor het gedrag van een lang pad: CreateDirectoryW, CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW.
Dit zijn de bestandsbeheerfuncties die niet langer MAX_PATH beperkingen hebben als u zich aanmeldt voor gedrag voor lang pad: CopyFileW, CopyFile2, CopyFileExW, CreateFileW, CreateFile2, CreateHardLinkW, CreateSymbolicLinkW, DeleteFileW, FindFirstFileW, FindFirstFileExW, FindNextFileW, GetFileAttributesW, GetFileAttributesExW, SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchFileW, SearchFirstFileNameW, FindFirstFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.