Limitation de longueur maximale du chemin

Dans l’API Windows (avec certaines exceptions décrites dans les paragraphes suivants), la longueur maximale d’un chemin d’accès est MAX_PATH, qui est définie sur 260 caractères. Un chemin local est structuré dans l’ordre suivant : lettre de lecteur, signe deux-points, barre oblique inverse, composants de nom séparés par des barres obliques inverses et caractère null de fin. Par exemple, le chemin maximal sur le lecteur D est « D:\some 256-character path string<NUL> » où «< NUL> » représente le caractère null de fin invisible pour la page de codes système actuelle. (Les caractères <> sont utilisés ici pour la clarté visuelle et ne peuvent pas faire partie d’une chaîne de chemin d’accès valide.)

Par exemple, vous pouvez atteindre cette limitation si vous clonez un dépôt Git qui a des noms de fichiers longs dans un dossier qui a lui-même un nom long.

Notes

Les fonctions d’E/S de fichier dans l’API Windows convertissent « / » en « \ » dans le cadre de la conversion du nom en nom de style NT, sauf lorsque vous utilisez le préfixe « \\?\ » comme indiqué dans les sections suivantes.

L’API Windows a de nombreuses fonctions qui ont également des versions Unicode pour autoriser un chemin d’accès étendu pour une longueur totale maximale de 32 767 caractères. Ce type de chemin est composé de composants séparés par des barres obliques inverses, chacune jusqu’à la valeur retournée dans le paramètre lpMaximumComponentLength de la fonction GetVolumeInformation (cette valeur est généralement de 255 caractères). Pour spécifier un chemin d’accès de longueur étendue, utilisez le préfixe « \\?\ ». Par exemple, « \\?\D:\très long chemin ».

Notes

Le chemin d’accès maximal de 32 767 caractères est approximatif, car le préfixe « \\?\ » peut être étendu à une chaîne plus longue par le système au moment de l’exécution, et cette extension s’applique à la longueur totale.

Le préfixe « \\?\ » peut également être utilisé avec des chemins construits en fonction de la convention d’affectation de noms universelle (UNC). Pour spécifier un tel chemin à l’aide d’UNC, utilisez le préfixe « \\?\UNC\ ». Par exemple, « \\?\UNC\server\share », où « serveur » est le nom de l’ordinateur et « partage » est le nom du dossier partagé. Ces préfixes ne sont pas utilisés dans le cadre du chemin d’accès lui-même. Ils indiquent que le chemin d’accès doit être transmis au système avec une modification minimale, ce qui signifie que vous ne pouvez pas utiliser de barres obliques pour représenter les séparateurs de chemins, ou un point pour représenter le répertoire actif, ou des points doubles pour représenter le répertoire parent. Étant donné que vous ne pouvez pas utiliser le préfixe « \\?\ » avec un chemin d’accès relatif, les chemins relatifs sont toujours limités à un total de MAX_PATH caractères.

Il n’est pas nécessaire d’effectuer une normalisation Unicode sur les chaînes de chemin d’accès et de nom de fichier à utiliser par les fonctions de l’API d’E/S de fichier Windows, car le système de fichiers traite le chemin d’accès et les noms de fichiers comme une séquence opaque de WCHARs. Toute normalisation requise par votre application doit être effectuée à l’esprit, à l’extérieur de tous les appels aux fonctions d’API d’E/S de fichiers Windows associées.

Lorsque vous utilisez une API pour créer un répertoire, le chemin d’accès spécifié ne peut pas être si long que vous ne pouvez pas ajouter un nom de fichier 8.3 (autrement dit, le nom du répertoire ne peut pas dépasser MAX_PATH moins 12).

L’interpréteur de commandes et le système de fichiers ont des exigences différentes. Il est possible de créer un chemin avec l’API Windows que l’interface utilisateur de l’interpréteur de commandes n’est pas en mesure d’interpréter correctement.

Activer les chemins longs dans Windows 10, version 1607 et ultérieures

À compter de Windows 10, version 1607, MAX_PATH limitations ont été supprimées des fonctions courantes de fichiers et de répertoires Win32. Toutefois, vous devez accepter le nouveau comportement.

Pour activer le nouveau comportement de chemin long, les deux conditions suivantes doivent être remplies :

  • La clé Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled (Type: REG_DWORD) de Registre doit exister et être définie sur 1. La valeur de la clé est mise en cache par le système (par processus) après le premier appel à une fonction de fichier ou de répertoire Win32 affectée (voir ci-dessous pour obtenir la liste des fonctions). La clé de Registre ne sera pas rechargée pendant la durée de vie du processus. Pour que toutes les applications du système reconnaissent la valeur de la clé, un redémarrage peut être nécessaire, car certains processus peuvent avoir démarré avant la définition de la clé.

Vous pouvez également copier ce code dans un .reg fichier qui peut le définir pour vous, ou utiliser la commande PowerShell à partir d’une fenêtre de terminal avec des privilèges élevés :

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001

Notes

Cette clé de Registre peut également être contrôlée via stratégie de groupe à l’adresse Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths.

  • Le manifeste de l’application doit également inclure l’élément 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>
    

Il s’agit des fonctions de gestion d’annuaire qui n’ont plus MAX_PATH restrictions si vous optez pour un comportement de chemin d’accès long : CreateDirectoryW, CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW.

Il s’agit des fonctions de gestion de fichiers qui n’ont plus MAX_PATH restrictions si vous optez pour un comportement de chemin d’accès long : CopyFileW, CopyFile2, CopyFileExW, CreateFileW, CreateFile2, CreateHardLinkW, CreateSymbolicLinkW, DeleteFileW, FindFirstFileW, FindFirstFileExW, FindNextFileW, GetFileAttributesW, GetFileAttributesExW, SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileNameW, FindFirstFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.