J'ai rencontré ce problème à quelques reprises à des moments inopportuns:
- Essayer de travailler sur des projets Java open source avec des chemins profonds
- Stockage d'arbres wiki Fitnesse profonds dans le contrôle de code source
- Une erreur lors de l'utilisation de Bazaar pour importer mon arborescence de contrôle de code source
Pourquoi cette limite existe-t-elle?
Pourquoi n'a-t-il pas encore été supprimé?
Comment gérez-vous la limite de chemin? Et non, passer à Linux ou Mac OS X n'est pas une réponse valable à cette question;)
Réponses:
Citant cet article https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation
Nous voyons maintenant qu'il s'agit de 1 + 2 + 256 + 1 ou [lecteur] [: \] [chemin] [null] = 260. On pourrait supposer que 256 est une longueur de chaîne fixe raisonnable à partir des jours DOS. Et pour en revenir aux API DOS, nous nous rendons compte que le système a suivi le chemin actuel par lecteur, et nous avons 26 lecteurs ( 32 avec symboles) maximum (et répertoires actuels).
L'INT 0x21 AH = 0x47 dit "Cette fonction renvoie la description du chemin sans la lettre de lecteur et la barre oblique inverse initiale." Nous voyons donc que le système stocke le CWD sous forme de paire (lecteur, chemin) et vous demandez le chemin en spécifiant le lecteur (1 = A, 2 = B,…), si vous spécifiez un 0, il suppose le chemin pour le lecteur renvoyé par INT 0x21 AH = 0x15 AL = 0x19. Alors maintenant, nous savons pourquoi il est 260 et non 256, car ces 4 octets ne sont pas stockés dans la chaîne de chemin d'accès.
Pourquoi une chaîne de chemin de 256 octets, car 640 Ko est suffisant de RAM.
la source
Ce n'est pas strictement vrai car le système de fichiers NTFS prend en charge des chemins jusqu'à 32k caractères. Vous pouvez utiliser l 'api win32 et le
\\?\
préfixe " " du chemin pour utiliser plus de 260 caractères.Une explication détaillée du long chemin du blog de l'équipe .Net BCL .
Un petit extrait met en évidence le problème des longs chemins
la source
La question est de savoir pourquoi la limitation existe toujours. Certes, les fenêtres modernes peuvent augmenter le côté
MAX_PATH
pour permettre des chemins plus longs. Pourquoi la limitation n'a-t-elle pas été supprimée?Grâce au contrat d'API, Windows a garanti à toutes les applications que les API de fichier standard ne renverront jamais un chemin plus long que les
260
caractères.Considérez le code correct suivant:
Windows a garanti mon programme qu'il remplirait ma
WIN32_FIND_DATA
structure:Mon application n'a pas déclaré la valeur de la constante
MAX_PATH
, l'API Windows l'a fait. Mon application a utilisé cette valeur définie.Ma structure est correctement définie et alloue uniquement des
592
octets au total. Cela signifie que je ne peux recevoir qu'un nom de fichier inférieur à des260
caractères. Windows m'a promis que si j'écrivais correctement ma candidature, ma candidature continuerait de fonctionner à l'avenir.Si Windows autorisait les noms de fichiers plus longtemps que les
260
caractères, mon application existante (qui utilisait correctement l'API correcte) échouerait.Pour quiconque appelle Microsoft à modifier la
MAX_PATH
constante, il doit d'abord s'assurer qu'aucune application existante n'échoue. Par exemple, je possède toujours et j'utilise une application Windows écrite pour fonctionner sous Windows 3.11. Il fonctionne toujours sur Windows 10 64 bits. C'est ce que vous offre la compatibilité descendante.Microsoft a créé un moyen d'utiliser les 32 768 noms de chemin complets; mais ils ont dû créer un nouveau contrat API pour le faire. D'une part, vous devez utiliser l' API Shell pour énumérer les fichiers (car tous les fichiers n'existent pas sur un disque dur ou un partage réseau).
Mais ils doivent également ne pas casser les applications utilisateur existantes. La grande majorité des applications n'utilisent pas l'API shell pour le travail sur fichier. Tout le monde appelle
FindFirstFile
/FindNextFile
et l'appelle un jour.la source
Depuis Windows 10. vous pouvez supprimer la limitation en modifiant une clé de registre.
la source
Vous pouvez monter un dossier en tant que lecteur. À partir de la ligne de commande, si vous avez un chemin,
C:\path\to\long\folder
vous pouvez le mapper en lettre de lecteur enX:
utilisant:la source
subst
est local-session / compte - voir superuser.com/questions/29072/… pour savoir comment le rendre «à l'échelle du système»Une façon de faire face à la limite de chemin consiste à raccourcir les entrées de chemin avec des liens symboliques.
Par exemple:
C:\p
répertoire pour conserver des liens courts vers de longs cheminsmklink /J C:\p\foo C:\Some\Crazy\Long\Path\foo
C:\p\foo
à votre chemin au lieu du long cheminla source
/j
option 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). Il ne crée pas de lien symbolique. C'est une distinction importante car les points de montage de jonction sont toujours évalués sur un serveur et doivent cibler les 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 le permet). 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 également entre le chemin de remplacement et le chemin d'affichage.Vous pouvez activer des noms de chemin longs à l'aide de PowerShell:
Une autre version consiste à utiliser une stratégie de groupe dans
Computer Configuration
/Administrative Templates
/System
/Filesystem
:la source
Quant à savoir pourquoi cela existe toujours - MS ne considère pas cela comme une priorité et valorise la compatibilité ascendante par rapport à l'avancement de leur système d'exploitation (au moins dans ce cas).
Une solution de contournement que j'utilise consiste à utiliser les «noms courts» pour les répertoires du chemin, au lieu de leurs versions standard lisibles par l'homme. Donc, par exemple, pour
C:\Program Files\
que j'utilise,C:\PROGRA~1\
vous pouvez trouver les équivalents de noms courts en utilisantdir /x
.la source
PATH
et passez-le àSearchPathW
. Il est également efficace, car la bibliothèque d'exécution crée de toute façon des chemins de périphérique "\\? \" Pour NT. En ce qui concerne les systèmes de fichiers plus récents, nous ne verrions probablement pas de logiciel installé sur un volume exFAT, autre que des applications portables, car il n'a aucune sécurité, mais je n'exclurais pas ReFS. Les utilisateurs installent des programmes dans des emplacements non standard pour des raisons de commodité, d'espace ou de performances.Quant à savoir comment gérer la limitation de la taille du chemin sous Windows - l'utilisation de 7zip pour emballer (et décompresser) vos fichiers sensibles à la longueur du chemin semble être une solution de contournement viable. Je l'ai utilisé pour transporter plusieurs installations IDE (ces chemins de plug-in Eclipse, yikes!) Et des tas de documentation générée automatiquement et je n'ai eu aucun problème jusqu'à présent.
Je ne sais pas vraiment comment il échappe à la limite de 260 caractères définie par Windows (à partir d'un PoV technique), mais bon, cela fonctionne!
Plus de détails sur leur page SourceForge ici :
et notes de version :
REMARQUE IMPORTANTE: pour que cela fonctionne correctement, vous devrez spécifier directement le chemin de destination dans la boîte de dialogue "Extraire" de 7zip , plutôt que de glisser-déposer les fichiers dans le dossier prévu. Sinon, le dossier "Temp" sera utilisé comme cache intermédiaire et vous rebondirez dans la même limitation de 260 caractères une fois que l'Explorateur Windows commencera à déplacer les fichiers vers leur "lieu de repos final". Voir les réponses à cette question pour plus d'informations.
la source
C'est le cas, et c'est une valeur par défaut pour une raison quelconque, mais vous pouvez facilement la remplacer avec cette clé de registre:
Voir: https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/
la source
Une autre façon d'y faire face est d'utiliser Cygwin, selon ce que vous voulez faire avec les fichiers (c'est-à-dire si les commandes Cygwin répondent à vos besoins)
Par exemple, il permet de copier, déplacer ou renommer des fichiers que même l'explorateur Windows ne peut pas. Ou bien sûr en traiter le contenu comme md5sum, grep, gzip, etc.
Aussi pour les programmes que vous codez, vous pouvez les lier à la DLL Cygwin et cela leur permettrait d'utiliser de longs chemins (je n'ai pas testé cela cependant)
la source