Limitation de longueur maximale du chemin
Dans l'API Windows (à quelques exceptions près, décrites dans les paragraphes suivants), la longueur maximale d'un chemin d'accès est MAX_PATH, qui est définie comme étant de 260 caractères. Un chemin d'accès local est structuré dans l'ordre suivant : lettre du lecteur, deux points, barre oblique inverse, composants du nom séparés par des barres obliques inverses et un caractère nul de terminaison. Par exemple, le chemin d'accès maximal sur le lecteur D est "D:\N-une chaîne de 256 caractères<NUL>" où "<NUL>" représente le caractère nul invisible de fin pour la page de code du système actuel. (Les caractères <> sont utilisés ici pour des raisons de clarté visuelle et ne peuvent pas faire partie d'une chaîne de chemin d'accès valide).
Par exemple, vous pouvez rencontrer cette limitation si vous clonez un référentiel git qui a des noms de fichiers longs dans un dossier qui a lui-même un nom long.
Remarque
Les fonctions d'E/S de fichiers de l'API Windows convertissent "/" en "\" dans le cadre de la conversion du nom en un nom de style NT, sauf lorsque vous utilisez le préfixe "\?\" comme indiqué dans les sections suivantes.
L'API Windows possède de nombreuses fonctions qui ont également des versions Unicode pour permettre un chemin d'accès de longueur étendue pour une longueur de chemin d'accès totale maximale de 32 767 caractères. Ce type de chemin est composé d'éléments séparés par des barres obliques inverses, chacun d'entre eux ayant une valeur inférieure ou égale au 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:\chemin d'accès très long".
Remarque
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 "\N- \N" peut également être utilisé avec des chemins d'accès construits selon la convention de nommage universelle (UNC). Pour spécifier un tel chemin en utilisant UNC, utilisez le préfixe "\N-UNC\N". Par exemple, "\N-UNC\Nserver\Nshare", où "server" est le nom de l'ordinateur et "share" est le nom du dossier partagé. Ces préfixes ne font pas partie du chemin d'accès lui-même. Ils indiquent que le chemin doit être transmis au système avec un minimum de modifications, ce qui signifie que vous ne pouvez pas utiliser de barres obliques de transfert pour représenter les séparateurs de chemin, ni de point pour représenter le répertoire actuel, ni de double point pour représenter le répertoire parent. Comme vous ne pouvez pas utiliser le préfixe "\N?\N" avec un chemin 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 noms de fichiers et de chemins d'accès en vue de leur utilisation par les fonctions de l'API d'E/S de fichiers de Windows, car le système de fichiers traite les noms de fichiers et de chemins d'accès comme une séquence opaque de WCHAR. Toute normalisation requise par votre application doit être effectuée en gardant cela à l'esprit, en dehors de tout appel aux fonctions de l'API d'E/S de fichiers de Windows.
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 puissiez pas ajouter un nom de fichier 8.3 (c'est-à-dire que le nom du répertoire ne peut pas dépasser MAX_PATH moins 12).
L'interpréteur de commande 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 commande n'est pas en mesure d'interpréter correctement.
Activer les chemins longs dans Windows 10, version 1607 et suivantes.
À partir de Windows 10, version 1607, les limitations MAX_PATH ont été supprimées de nombreuses fonctions courantes de fichiers et de répertoires Win32. Cependant, votre application doit opter pour le nouveau comportement.
Pour activer le nouveau comportement des chemins d'accès longs par application, deux conditions doivent être remplies. Une valeur de registre doit être définie et le manifeste de l'application doit inclure l'élément longPathAware
.
Paramètre de registre pour activer les chemins longs
Important
Comprenez que l'activation de ce paramètre de registre n'affectera que les applications qui ont été modifiées pour tirer parti de la nouvelle fonctionnalité. Les développeurs doivent déclarer que leurs applications prennent en compte les chemins longs, comme indiqué dans les paramètres du manifeste de l'application ci-dessous. Cette modification n'affectera pas toutes les applications.
La valeur de registre HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)
doit exister et être définie sur 1
. La valeur du registre sera mise en cache par le système (par processus) après le premier appel à une fonction Win32 de fichier ou de répertoire affectée (voir ci-dessous pour la liste des fonctions). La valeur du 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, un redémarrage peut être nécessaire car certains processus peuvent avoir démarré avant que la clé n'ait été définie.
Vous pouvez également copier ce code dans un fichier .reg
qui le définira 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
Remarque
Ce paramètre du registre peut également être contrôlé via la stratégie de groupe à Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths
Mise à jour du manifeste de l'application pour déclarer la capacité des chemins d'accès longs
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>
Fonctions sans restrictions MAX_PATH
Il s'agit des fonctions de gestion des répertoires qui n'ont plus de restrictions MAX_PATH si vous optez pour le comportement des chemins d'accès longs : 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 des chemins d'accès longs : 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.
Voir aussi
Fonctions de gestion des fichiers