Az elérési út maximális hosszának korlátozása
A Windows API-ban (a következő bekezdésekben tárgyalt kivételekkel) az elérési út maximális hossza MAX_PATH, amely 260 karakterből áll. A helyi elérési út a következő sorrendben van felépítve: meghajtóbetűjel, kettőspont, fordított perjel, fordított perjellel elválasztott névösszetevők és egy null karakter végződése. A D meghajtón például a "D:\egy 256 karakterből álló elérési út sztringje<NUL>" ahol a "<NUL>" az aktuális rendszer kódlapjának láthatatlan null karakterét jelöli. (A <> karaktereket itt a vizualizáció egyértelműsége érdekében használjuk, és nem lehet egy érvényes elérésiút-sztring része.)
Ez a korlátozás például akkor fordulhat elő, ha olyan git-adattárat klónoz, amely hosszú fájlnevekkel rendelkezik egy olyan mappába, amelynek hosszú a neve.
Jegyzet
A Windows API fájl I/O-függvényei a név NT-stílusú névvé alakításának részeként "/"\"-ra konvertálhatók, kivéve, ha a következő szakaszokban részletezett "\\?\" előtagot használja.
A Windows API számos olyan funkcióval rendelkezik, amelyek Unicode-verziókkal is rendelkeznek, amelyek lehetővé teszik a teljes elérési út maximális hosszának 32 767 karakter hosszúságú meghosszabbítását. Ez az elérési út olyan összetevőkből áll, amelyeket fordított perjelek választanak el egymástól, egészen a lpMaximumComponentLength paraméterben visszaadott értékig a GetVolumeInformation függvényben (ez az érték általában 255 karakter). Ha hosszabb elérési utat szeretne megadni, használja a "\\?\" előtagot. Például a "\\?\D:\nagyon hosszú elérési út".
Jegyzet
A 32 767 karakter maximális elérési útja hozzávetőleges, mivel a "\\?\" előtagot a rendszer hosszabb sztringre bővítheti futásidőben, és ez a kiterjesztés a teljes hosszra vonatkozik.
A "\\?\" előtag használható az univerzális elnevezési konvenció (UNC) szerint létrehozott útvonalakkal is. Ha unc használatával szeretne ilyen elérési utat megadni, használja a "\\?\UNC\" előtagot. Ilyen például a "\\?\UNC\server\share", ahol a "kiszolgáló" a számítógép neve, a "megosztás" pedig a megosztott mappa neve. Ezeket az előtagokat a program nem használja az elérési út részeként. Azt jelzik, hogy az elérési utat minimális módosítással kell átadni a rendszernek, ami azt jelenti, hogy nem használhat perjeleket az elérési útelválasztók, illetve az aktuális könyvtárat jelképező időszak, illetve a szülőkönyvtárat jelképező dupla pontok használatával. Mivel a "\\?\" előtagot nem használhatja relatív elérési úttal, a relatív elérési utak mindig MAX_PATH karakterek összegére korlátozódnak.
A Windows-fájl I/O API-függvények által használt elérési utakon és fájlnév-sztringeken nincs szükség Unicode-normalizálásra, mivel a fájlrendszer az elérési utat és a fájlneveket WCHAR-ek átlátszatlan sorozataként kezeli. Az alkalmazás által igényelt normalizálást ezt szem előtt tartva kell végrehajtani, a kapcsolódó Windows-fájl I/O API-függvények felé irányuló hívásokon kívül.
Ha API-t használ egy könyvtár létrehozásához, a megadott elérési út nem lehet olyan hosszú, hogy nem fűzhet hozzá 8.3 fájlnevet (azaz a címtár neve nem haladhatja meg a MAX_PATH mínusz 12 értéket).
A rendszerhéj és a fájlrendszer eltérő követelményekkel rendelkezik. Létrehozhat egy elérési utat a Windows API-val, amelyet a rendszerhéj felhasználói felülete nem tud megfelelően értelmezni.
Hosszú útvonalak engedélyezése a Windows 10 1607-es és újabb verzióiban
A Windows 10 1607-es verziójától kezdve MAX_PATH korlátozások el lettek távolítva számos gyakori Win32-fájl- és könyvtárfüggvényből. Az alkalmazásnak azonban be kell jelentkeznie az új viselkedésbe.
Az új hosszú elérési út alkalmazásonkénti viselkedésének engedélyezéséhez két feltételnek kell teljesülnie. Be kell állítani egy beállításjegyzék-értéket, és az alkalmazásjegyzéknek tartalmaznia kell a longPathAware
elemet.
Beállításjegyzék-beállítás a hosszú elérési utak engedélyezéséhez
Fontos
Vegye figyelembe, hogy a beállításjegyzék-beállítás engedélyezése csak azokat az alkalmazásokat érinti, amelyeket módosítottak az új funkció előnyeinek kihasználásához. A fejlesztőknek hosszú elérési útnak kell deklarálniuk az alkalmazásjegyzék beállításaiban . Ez nem egy olyan változás, amely minden alkalmazást érint.
A beállításjegyzék-értéknek HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)
léteznie kell, és 1
értékre kell állítania. A beállításjegyzék értékét a rendszer gyorsítótárazza (folyamatonként) az érintett Win32-fájl vagy könyvtárfüggvény első hívása után (a függvények listáját alább találja). A beállításjegyzék-érték nem lesz újra betöltve a folyamat élettartama alatt. Ahhoz, hogy a rendszer összes alkalmazása felismerje az értéket, újraindításra lehet szükség, mert előfordulhat, hogy egyes folyamatok a kulcs beállítása előtt kezdődtek.
Ezt a kódot egy .reg
fájlba is másolhatja, amely ezt beállíthatja Önnek, vagy használhatja a PowerShell-parancsot egy emelt szintű jogosultságokkal rendelkező terminálablakból:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
Jegyzet
Ez a beállításjegyzék-beállítás csoportházirenddel is vezérelhető a Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths
. A szabályzat a Microsoft Intune-nal is alkalmazható házirendkonfigurációs szolgáltató (CSP)használatával.
Alkalmazásjegyzék-frissítések a hosszú elérési út képességének deklarálásához
A alkalmazásjegyzék- tartalmaznia kell a longPathAware
elemet is.
<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>
MAX_PATH korlátozások nélküli függvények
Ezek azok a címtárkezelési függvények, amelyek már nem rendelkeznek MAX_PATH korlátozásokkal, ha a hosszú elérési út viselkedését választja: CreateDirectoryW, CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW.
Ezek azok a fájlkezelési függvények, amelyek már nem rendelkeznek MAX_PATH korlátozásokkal, ha hosszú elérési útra jelentkezik be: 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.