Limitation de longueur maximale du chemin

Dans l’API Windows (avec quelques 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 d’accès local est structuré dans l’ordre suivant : lettre de lecteur, deux-points, barre oblique inverse, composants de nom séparés par des barres obliques inverses et un caractère null de fin. Par exemple, le chemin d’accès 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 code 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 lui-même a 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 lors de l’utilisation du 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 de longueur étendue 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 développé en 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 d’accès construits conformément à 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ù « server » est le nom de l’ordinateur et « share » est le nom du dossier partagé. Ces préfixes ne sont pas utilisés dans le cadre du chemin 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 des séparateurs de chemin, 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 relatif, les chemins d’accès 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 d’API d’E/S de fichier Windows, car le système de fichiers traite les chemins d’accès et les noms de fichiers comme une séquence opaque de WCHAR. Toute normalisation requise par votre application doit être effectuée en ayant à l’esprit les appels à des fonctions d’API d’E/S de fichier 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 d’accès 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érieure

À compter de Windows 10, version 1607, MAX_PATH limitations ont été supprimées des fonctions de fichier et de répertoire Win32 courantes. Toutefois, vous devez vous inscrire au 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é sera 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 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 sur le système reconnaissent la valeur de la clé, un redémarrage peut être nécessaire, car certains processus ont peut-être 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 d’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 de restrictions MAX_PATH si vous optez pour le 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 de restrictions MAX_PATH si vous optez pour le comportement de chemin d’accès long : CopyFileW, CopyFile2, CopyFileExW, CreateFileW, CreateFile2, CreateHardLinkW, CreateSymbolicLinkW, DeleteFileW, FindFirstFileW, FindNextFileW, GetFileAttributesW, GetFileAttributesExW, SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.