490 votes

Pourquoi la limite de 260 caractères pour la longueur des chemins existe-t-elle dans Windows ?

J'ai été confronté à ce problème à plusieurs reprises à des moments inopportuns :

  • Essayer de travailler sur des projets Java open source avec des voies profondes
  • Stockage des arbres wiki profonds de Fitnesse dans le contrôle de source
  • Une erreur s'est produite lorsque j'ai essayé d'utiliser Bazaar pour importer mon arbre de contrôle des sources.

Pourquoi cette limite existe-t-elle ?

Pourquoi n'a-t-il pas encore été retiré ?

Comment faites-vous face à la limite des chemins d'accès ? Et non, passer à Linux ou Mac OS X n'est pas une réponse valable à cette question ;)

10 votes

@Artelius : En fait, Windows (au moins à partir de Win2K) supporte les points de jonction ( fr.wikipedia.org/wiki/NTFS_junction_point ), et à partir de Vista, les liens symboliques NT ( fr.wikipedia.org/wiki/NTFS_symbolic_link ). Quoi qu'il en soit, alors que les liens symboliques peuvent aider à rendre plus conviviaux les chemins longs/enchevêtrés, je ne vois pas comment les liens symboliques pourraient aider si vous atteignez les limites de longueur des chemins.

1 votes

Sur mon PC Windows 8, la limite semble être d'environ 1024 caractères, donc à voir.

11 votes

Même si cette limite n'existait pas, il y a toujours beaucoup d'autres limites, et chacune d'entre elles pourrait être gênante à un moment donné. La question est de savoir pourquoi cette limite est si basse ? Après l'ère de la 8.3, et avec du matériel de taille méga/giga, un chemin devrait maintenant être une chaîne allouée dynamiquement avec une taille virtuellement illimitée.

287voto

valli Points 1789

Citant cet article https://docs.microsoft.com/en-us/Windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation

Limitation de la longueur maximale du chemin

Dans l'API Windows (avec quelques exceptions discutées dans les paragraphes suivants), la longueur maximum d'un chemin est de MAX_PATH qui est défini 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 inversée, composants du nom séparés par des barres obliques inversées et un caractère nul final. Par exemple, le chemin d'accès maximal sur le lecteur D est "D:\". un chemin d'accès de 256 caractères <NUL>" où "<NUL>" représente le caractère nul de terminaison invisible pour la page de code système actuelle. (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).

Nous voyons maintenant que c'est 1+2+256+1 ou [drive][:\][path][null] = 260. On peut supposer que 256 est une longueur de chaîne fixe raisonnable à l'époque du DOS. Et en revenant aux API DOS, nous nous rendons compte que le système suit le chemin actuel par lecteur, et nous avons 26 (32 avec les symboles) lecteurs maximum (et les répertoires actuels).

L'INT 0x21 AH=0x47 dit "Cette fonction renvoie la description du chemin sans la lettre du lecteur et la barre oblique inverse initiale". Nous voyons donc que le système stocke le CWD sous la forme d'une paire (lecteur, chemin) et que vous demandez le chemin en spécifiant le lecteur (1=A, 2=B, ), si vous spécifiez un 0 alors il prend le chemin du lecteur retourné par INT 0x21 AH=0x15 AL=0x19. Donc maintenant nous savons pourquoi c'est 260 et pas 256, parce que ces 4 octets ne sont pas stockés dans la chaîne du chemin.

Pourquoi une chaîne de chemin de 256 octets, parce que 640K est une RAM suffisante.

30 votes

L'API Windows limite la longueur, même dans le dernier OS. Microsoft a peur de casser des centaines de millions de systèmes d'exploitation utilisés aujourd'hui si cela devait changer, parce qu'il n'y a plus de génies qui travaillent pour eux et qui comprennent parfaitement l'API, comme dans les années 1980 et 1990. Le risque ne vaut pas la peine de le changer. serverfault.com/questions/163419/

2 votes

... c'est la même raison pour laquelle ils stockent les pilotes 64 bits dans le dossier system32, et les pilotes 32 bits dans le dossier SysWOW64. Le risque de briser l'API originale de Windows pourrait les mettre en faillite parce que leurs développeurs ne la comprennent pas assez bien.

106 votes

@MacGyver Désolé, mais c'est complètement absurde. Microsoft ne veut pas casser les millions d'applications mal écrites qui existent et qui supposez des choses sur le système qui n'étaient jamais garanties. Malheureusement, les choses sont restées inchangées pendant si longtemps que les développeurs ont fini par s'y fier, si bien qu'un changement maintenant casserait les applications tierces et MS serait blâmé.

182voto

Pratik Points 5401

Ce n'est pas strictement vrai, car le système de fichiers NTFS prend en charge les chemins d'accès jusqu'à 32 000 caractères. Vous pouvez utiliser l'api win32 et " \\?\ "préfixe le chemin d'accès pour utiliser plus de 260 caractères.

Une explication détaillée du chemin long à partir de la base de données .Net. Blog de l'équipe du BCL .
Un petit extrait met en évidence le problème des chemins longs

Une autre préoccupation est le comportement incohérent qui résulterait de l'exposition du support des longs chemins. Les chemins longs avec l'option \\?\ peut être utilisé dans la plupart des API Windows liées aux fichiers, mais pas dans toutes les API Windows. Par exemple, LoadLibrary, qui mappe un module à l'adresse du processus appelant, échoue si le nom du fichier est plus long que MAX_PATH. Cela signifie donc que MoveFile vous permettra de déplacer une DLL vers un emplacement tel que son chemin d'accès compte plus de 260 caractères, mais lorsque vous essaierez de charger la DLL, il échouera. Il existe des exemples similaires dans l'ensemble des API de Windows ; il existe des solutions de contournement, mais au cas par cas.

5 votes

D'accord, mais cela signifie que vous devez utiliser P/Invoke à de nombreux endroits, ce qui, à mon avis, réduit la portabilité de votre code .Net. Et si je voulais conserver la compatibilité avec Mono ?

2 votes

Ce que je voulais dire, c'est que vous pouvez utiliser le chemin long si vous le voulez vraiment. Mais je suis d'accord pour dire que c'est pénible et personnellement, je l'éviterais aussi.

10 votes

Ceci devrait être la réponse choisie. Elle répond en fait à la question posée par l'utilisateur, à savoir POURQUOI cette limite existe ET fournit une solution de contournement. Upvote pour la visibilité

40voto

jonchang Points 680

Vous pouvez monter un dossier comme un lecteur. À partir de la ligne de commande, si vous avez un chemin d'accès C:\path\to\long\folder vous pouvez l'associer à une lettre de lecteur X: en utilisant :

subst x: \path\to\long\folder

0 votes

Je reçois le message "Invalid paramter j :" lorsque je tente cette commande.

0 votes

Cette opération doit être exécutée à partir d'une invite de commande d'un administrateur (élevé).

0 votes

Cela échouera avec des barres obliques, il faut des barres obliques inversées.

20voto

JDiMatteo Points 8

Une façon de faire face à la limite des chemins est de raccourcir les entrées des chemins avec des liens symboliques.

Par exemple :

  1. créer un C:\p répertoire pour conserver les liens courts vers les chemins longs
  2. mklink /J C:\p\foo C:\Some\Crazy\Long\Path\foo
  3. ajouter C:\p\foo à votre chemin au lieu du long chemin

4 votes

Je n'ai pas eu à créer le répertoire en premier, donc l'étape 1 n'est pas nécessaire.

4 votes

Cette astuce ne fonctionne pas toujours car de nombreuses applications tentent de résoudre les liens

4 votes

El /j crée un point de montage de jonction pour un périphérique de volume local ou un chemin sur un volume local (comme un montage de liaison Unix). Elle ne crée pas de lien symbolique. Il s'agit d'une distinction importante car les points de montage de jonction sont toujours évalués sur un serveur et doivent cibler des périphériques locaux, tandis que les liens symboliques sont évalués sur le client et peuvent cibler des chemins distants (si la stratégie l'autorise). Comme un lecteur subst.exe (c.-à-d. DefineDosDeviceW ), une cible de jonction est généralement limitée à environ 4K caractères. Il s'agit en fait de 8K caractères, répartis à peu près équitablement entre le chemin de substitution et le chemin d'affichage.

5voto

Dan Points 41

Nous venons de migrer vers TFS, et nous avons rencontré exactement le même problème. Dans notre cas, la profondeur de nos dossiers et leurs noms ne sont pas extrêmement profonds ou longs en soi. Cependant, lorsqu'ils sont associés à l'espace de noms complet généré en tant que noms de fichiers par la génération de code "Add Webservice reference" de Visual Studio, l'utilisation de TFS devient problématique.

Je viens de passer beaucoup de temps à préparer le passage de notre entreprise à TFS pour découvrir que nous obtenons cette erreur en essayant de créer des branches. Notre ancien système de contrôle de la source n'avait pas ce problème, et nous pourrions finir par devoir revenir en arrière.

Visual Studio génère lui-même ces fichiers de référence de services longs en fonction de l'espace de noms. Le système de fichiers sous-jacent prend en charge les noms plus longs. Avec des espaces de noms et des dossiers clairs, il est plus facile pour les personnes qui ne sont pas familiarisées avec la base de code de comprendre le cadre de votre produit. L'objectif du code généré automatiquement est d'économiser du temps et de l'argent. Nous ne pouvons pas nous permettre de parcourir une grande base de code en renommant tous les dossiers et fichiers en quelque chose de court et cryptique à chaque fois que nous rencontrons ce problème parce qu'un générateur de code nomme les fichiers comme ceci.

Le développement a évolué. Il faut en tenir compte. Jusqu'à ce qu'il le soit, c'est un énorme point négatif pour TFS, et cela lui a fait perdre ma recommandation par rapport à d'autres systèmes de contrôle de source (il y a même des systèmes gratuits qui n'ont pas cette limitation).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X