Begränsning av maximal sökvägslängd
I Windows API (med vissa undantag som beskrivs i följande stycken) är den maximala längden för en sökväg MAX_PATH, som definieras som 260 tecken. En lokal sökväg är strukturerad i följande ordning: enhetsbeteckning, kolon, omvänt snedstreck, namnkomponenter avgränsade med omvänt snedstreck och ett avslutande null-tecken. Den maximala sökvägen på enhet D är till exempel "D:\en sökvägssträng på 256 tecken<NUL>" där "<NUL>" representerar det osynliga avslutande nulltecknet för den aktuella systemkodsidan. (Tecknen <> används här för visuell tydlighet och kan inte ingå i en giltig sökvägssträng.)
Du kan till exempel nå den här begränsningen om du klonar en git-lagringsplats som har långa filnamn i en mapp som i sig har ett långt namn.
Not
Fil-I/O-funktioner i Windows-API:et konverterar "/" till "\" som en del av konverteringen av namnet till ett NT-formatnamn, förutom när du använder prefixet "\\?\" enligt beskrivningen i följande avsnitt.
Windows API har många funktioner som också har Unicode-versioner för att tillåta en utökad sökväg för en maximal total sökvägslängd på 32 767 tecken. Den här typen av sökväg består av komponenter avgränsade med omvänt snedstreck, var och en upp till värdet som returneras i lpMaximumComponentLength parametern för funktionen GetVolumeInformation (det här värdet är vanligtvis 255 tecken). Om du vill ange en sökväg med utökad längd använder du prefixet "\\?\". Till exempel "\\?\D:\mycket lång sökväg".
Not
Den maximala sökvägen på 32 767 tecken är ungefärlig eftersom prefixet "\\?\" kan utökas till en längre sträng av systemet vid körning, och den här expansionen gäller för den totala längden.
Prefixet "\\?\" kan också användas med sökvägar som konstruerats enligt den universella namngivningskonventionen (UNC). Om du vill ange en sådan sökväg med UNC använder du prefixet "\\?\UNC\". Till exempel "\\?\UNC\server\share", där "server" är namnet på datorn och "resurs" är namnet på den delade mappen. Dessa prefix används inte som en del av själva sökvägen. De anger att sökvägen ska skickas till systemet med minimal ändring, vilket innebär att du inte kan använda snedstreck för att representera sökvägsavgränsare, eller en punkt som representerar den aktuella katalogen eller dubbla punkter för att representera den överordnade katalogen. Eftersom du inte kan använda prefixet "\\?\" med en relativ sökväg begränsas relativa sökvägar alltid till totalt MAX_PATH tecken.
Du behöver inte utföra någon Unicode-normalisering på sökvägs- och filnamnssträngar för användning av I/O API-funktionerna för Windows-filen eftersom filsystemet behandlar sökvägs- och filnamn som en ogenomskinlig sekvens av WCHAR-s. All normalisering som ditt program kräver bör utföras med detta i åtanke, externt för alla anrop till relaterade I/O API-funktioner för Windows-filer.
När du använder ett API för att skapa en katalog kan den angivna sökvägen inte vara så lång att du inte kan lägga till ett 8.3-filnamn (dvs. katalognamnet får inte överstiga MAX_PATH minus 12).
Gränssnittet och filsystemet har olika krav. Det är möjligt att skapa en sökväg med Windows API som gränssnittets användargränssnitt inte kan tolka korrekt.
Aktivera långa sökvägar i Windows 10, version 1607 och senare
Från och med Windows 10 version 1607 har MAX_PATH begränsningar tagits bort från många vanliga Win32-fil- och katalogfunktioner. Din app måste dock välja det nya beteendet.
För att aktivera det nya beteendet för långa sökvägar per program måste två villkor uppfyllas. Ett registervärde måste anges och programmanifestet måste innehålla elementet longPathAware
.
Registerinställning för att aktivera långa sökvägar
Viktig
Förstå att aktivering av den här registerinställningen endast påverkar program som har ändrats för att dra nytta av den nya funktionen. Utvecklare måste deklarera sina appar så att de är medvetna om den långa sökvägen, enligt beskrivningen i inställningarna för programmanifestet nedan. Det här är inte en ändring som påverkar alla program.
Registervärdet HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)
måste finnas och anges till 1
. Registervärdet cachelagras av systemet (per process) efter det första anropet till en påverkad Win32-fil eller katalogfunktion (se nedan för listan över funktioner). Registervärdet kommer inte att läsas in igen under processens livslängd. För att alla appar i systemet ska kunna identifiera värdet kan det krävas en omstart eftersom vissa processer kan ha startats innan nyckeln angavs.
Du kan också kopiera den här koden till en .reg
fil som kan ange detta åt dig, eller använda PowerShell-kommandot från ett terminalfönster med förhöjd behörighet:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
Not
Den här registerinställningen kan också styras via grupprincip på Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths
. Principen kan också tillämpas med Microsoft Intune med CSP (Policy Configuration Service Provider).
Programmanifestuppdateringar för att deklarera funktionen för lång sökväg
Det programmanifestet måste också innehålla elementet longPathAware
.
<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>
Funktioner utan MAX_PATH begränsningar
Det här är kataloghanteringsfunktionerna som inte längre har MAX_PATH begränsningar om du väljer beteende för långa sökvägar: CreateDirectoryW, CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW.
Det här är filhanteringsfunktionerna som inte längre har MAX_PATH begränsningar om du väljer beteende för långa sökvägar: CopyFileW, CopyFile2, CopyFileExW, CreateFileW, CreateFile2, CreateHardLinkW, CreateSymbolicLinkW, DeleteFileW, FindFirstFileW, FindFirstFileExW, FindNextFileW, GetFileAttributesW, GetFileAttributesExW, SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.