422 votes

Comment supprimer des répertoires dont les chemins/noms sont trop longs pour une suppression normale ?

Windows semble avoir une limite de longueur sur les noms de fichiers lorsqu'il essaie de les supprimer, bien que cela n'empêche pas ces fichiers d'être créés.

Notre processus de construction crée un certain nombre de fichiers temporaires (beaucoup sont construits à partir d'une WSDL) qui ne respectent pas cette limite. Notre ant script est en quelque sorte capable de les supprimer lors d'un nettoyage, mais parfois j'ai besoin de supprimer le répertoire workarea (où tous les fichiers temporaires vont) sans vraiment faire un nettoyage complet à partir de ant.

Ce sont les mêmes erreurs cette question Je ne sais pas toujours quels fichiers ou sous-répertoires spécifiques sont à l'origine du problème. Et j'essaie d'éviter tout processus manuel (autre que le déclenchement d'une commande unique) pour les supprimer réellement.

Si j'essaie de supprimer le répertoire à partir de l'Explorer, j'obtiens l'erreur suivante

Cannot delete [file name]: The file name you specified is not valid or too long.  
Specify a different file name

Essayer Remove-Item dans powershell donne l'erreur suivante :

Remove-Item : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
At line:1 char:12
+ Remove-Item  <<<< -force -Recurse <directory>

Quelqu'un connaît-il un outil ou un moyen facile de contourner cette erreur de suppression sans avoir à trouver manuellement les fichiers problématiques et à les déplacer/renommer ?

2 votes

J'ai trouvé la solution juste avant de poster cette question, mais comme d'autres peuvent rencontrer ce problème, j'ai décidé de la poster pour qu'ils puissent trouver la solution que j'ai trouvée.

0 votes

Oh, je sais, mais généralement, lorsque je fais ce genre de choses, je laisse la question "sans réponse" pendant un certain temps pour voir si quelqu'un d'autre a une meilleure solution.

0 votes

Par Far la solution la plus simple : youtube.com/watch?v=qQTyTprFAOg

26voto

gdw2 Points 1205

Le programme de Cygwin rm -rf fonctionne bien sur les longs chemins !

3 votes

Cygwin a parfaitement fonctionné pour moi ! J'ai juste fait un -rm -rf et tous les fichiers ont été supprimés.

3 votes

Cela a fonctionné pour moi aussi sous GNU bash, version 4.1.10(4)-release

2 votes

Cela fonctionnait très bien quand on l'exécutait depuis une fenêtre de commande Git Bash. J'avais installé GitGui pour cela.

23voto

Karl Glennon Points 371

Il suffit de déposer de Powershell dans la commande en exécutant ci-dessous :

Cmd /C "rmdir /S /Q <dir>"

4 votes

"Le répertoire n'est pas vide". Oups. Le PO veut supprimer un répertoire non vide.

0 votes

Quelle est la différence avec la réponse de @herms ?

20voto

Aupajo Points 2387

La solution de Dentrasi est ce qui a le mieux fonctionné pour moi, mais je voulais poster les étapes spécifiques dans une réponse de haut niveau.

  1. Téléchargez et installez la dernière version stable de 7zip .
  2. Lancez le gestionnaire de fichiers 7zip ( 7zfm.exe ).
  3. Dans le gestionnaire de fichiers de 7zip, naviguez de manière à voir le nom du dossier que vous voulez supprimer (c'est-à-dire que vous êtes dans le dossier parent).
  4. Maintenez le bouton Shift enfoncé.
  5. Cliquez sur le bouton " Supprimer bouton ", soit sur votre clavier, soit dans la barre d'outils du gestionnaire de fichiers 7zip ; Assurez-vous que vous tenez toujours la touche Shift enfoncée. .
  6. Cliquez sur le bouton " OK bouton " ; Assurez-vous que vous tenez toujours la touche Shift enfoncée. .

0 votes

Bien essayé, mais ça ne marche toujours pas pour moi avec des dizaines de milliers de dossiers récursifs. Seul rimraf a fonctionné.

0 votes

@JulianKnight : Ouais, cette approche n'a pas fini par fonctionner pour moi 100% du temps, non plus. Je voulais juste le mentionner parce que c'était parmi les processus les plus simples, et cela a au moins fonctionné une partie du temps. La seule chose que j'ai trouvée qui a fonctionné 100% du temps est l'approche Powershell + module NTFSSecurity script, que j'ai décrite ci-dessous. IIRC rimraf a échoué lorsqu'il a été appelé, ce qui explique comment je me suis retrouvé dans ce désordre en premier lieu. Voir ce fil de discussion Node.js pour plus de détails : github.com/nodejs/node-v0.x-archive/issues/

0 votes

Oui, il y aura toujours des problèmes de ce genre. En fait, c'est le code d'installation des bibliothèques de l'IDE Arduino qui m'a mis en difficulté (Java), j'ai accidentellement sélectionné le dossier contenant les bibliothèques comme dossier à partir duquel installer une bibliothèque et c'est parti ! J'ai tué le processus dès que je m'en suis rendu compte mais j'avais déjà des dizaines de milliers de dossiers (maudit i7/SSD !) La prochaine version principale de NPM est censée aider à résoudre la plupart des problèmes d'installation de bibliothèques pour Node car les dépendances devraient être rencontrées à partir d'une structure beaucoup plus plate. Je suis quand même très content que quelqu'un m'ait mis sur rimraf - facile et gratuit.

18voto

Sean Copenhaver Points 2070

Il y a deux choses qui ne sont pas déjà mentionnées dans les réponses existantes.

  1. Vous pouvez utiliser le préfixe de chemin de longueur étendue pour accéder aux chemins longs
  2. Avec Windows 10, vous pouvez activer la prise en charge des chemins longs pour une utilisation générale - notez toutefois que toutes les applications ne fonctionneront pas avec les chemins longs, vous devriez tester les logiciels plus anciens. Seuls les logiciels ayant une entrée de manifeste appropriée pourront en faire usage.

Préfixe du chemin long

L'API Windows dispose d'une fonction spéciale qui prend en charge les noms de chemin d'accès Unicode d'une longueur maximale de 32 000 caractères (chaque élément pouvant comporter jusqu'à 255 caractères).

On fait souvent référence à tort à la dénomination UNC, mais ce n'est pas le cas, bien que cela soit lié.

Le préfixe utilisé pour indiquer à l'API d'utiliser les longs chemins Unicode est le suivant \\?\ comme dans :

\\?\D:\very long path

Les noms UNC sont normalement utilisés pour faire référence à des chemins d'accès sur des serveurs distants sous la forme suivante \\servername\path name\file name . Vous pouvez combiner cela avec le préfixe de chemin long ainsi : \\?\UNC\server\share

Notez que certaines applications, mal écrites mais malheureusement assez courantes, ne prennent pas en charge les chemins de fichiers UNC ni le préfixe de chemin long.

Référence : https://msdn.microsoft.com/en-gb/library/Windows/desktop/aa365247(v=vs.85).aspx#maxpath

Support pour les longs trajets

Il s'agit d'une option qui a été ajoutée aux versions récentes de Windows 10. Elle n'est pas, à l'heure où nous écrivons ces lignes, activée par défaut car elle nécessite un support applicatif spécifique. Il est intéressant de noter que PowerShell a un support intégré, donc l'activation de cette option permettra d'utiliser les longs chemins directement dans les scripts de PowerShell.

Vous pouvez l'activer via l'éditeur de stratégie de groupe si vous avez une version de Windows qui en dispose. Ou vous pouvez simplement utiliser la modification suivante du registre. Comme toujours, veuillez sauvegarder la section du registre que vous modifiez avant de faire quoi que ce soit.

  1. Exécuter regedit.exe .
  2. Confirmez l'invite UAC.
  3. Naviguez jusqu'à la clé : HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy Objects\{48981759-12F2-42A6-A048-028B3973495F}Machine\System\CurrentControlSet\Policies
  4. Créer ou modifier la clé LongPathsEnabled .
  5. S'il n'existe pas, cliquez avec le bouton droit de la souris sur Politiques et sélectionnez Nouveau > Valeur Dword (32 bits) dans le menu.
  6. Définir LongPathsEnabled a 1 à activer.

Toutes les applications avec des entrées manifestes appropriées auront maintenant accès aux longs chemins standards POSIX. Cela devrait inclure les applications du Windows Store.

Référence : https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-Windows-10/

MISE À JOUR 2017-04-09

@maoizm m'a signalé un problème avec la clé de registre ci-dessus, j'ai donc fait un peu plus d'exploration . Il semble que vous pouvez maintenant définir la prise en charge des noms de fichiers longs avec une clé système :

HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)

Cela ne fonctionne toutefois que pour les applications qui sont spécifiquement configurées pour l'utiliser (ce qui nécessite une entrée dans le manifest.xml de l'application).

Vous devez également noter que vous ne pouvez pas utiliser de noms de chemin relatifs avec cette méthode.

0 votes

{48981759-12F2-42A6-A048-028B3973495F}Machine La partie du chemin du registre sera différente sur chaque ordinateur - cela peut ne pas être évident pour tout le monde.

1 votes

@maoizm - bon point, merci de le souligner. Veuillez consulter ma mise à jour pour une alternative si vous utilisez la mise à jour W10 Anniversary ou une version ultérieure.

0 votes

J'écris une bibliothèque appelée FoundationIO, et j'essaie de faire en sorte que le chemin long soit le chemin par défaut. Existe-t-il une fonction que je peux appeler ou une macro que je peux définir pour que le support du chemin long soit automatiquement activé pour tout utilisateur de ma bibliothèque ?

9voto

A9S6 Points 1917

La solution 7-zip fonctionne très bien. Une autre option si vous avez installé git est d'ouvrir un bash Shell et d'utiliser :

rm -f

(ou rm -rf pour les dossiers)

1 votes

Pour les non-initiés, veuillez expliquer comment vous "ouvrez un bash Shell" dans Windows ?

1 votes

@O.M.Y. vous devez installer git. Ensuite, à partir du menu de démarrage, vous pouvez ouvrir git bash ou si vous avez choisi d'avoir les extensions Shell lorsque vous avez installé git, alors vous pouvez faire un clic droit dans ou sur un dossier et sélectionner Git Bash Here

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X