web-dev-qa-db-fra.com

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

Lorsque vous essayez de supprimer, Windows semble limiter le nombre de noms de fichiers lorsque vous essayez de les supprimer, bien que cela n'empêche pas la création de ces fichiers.

Notre processus de génération crée un certain nombre de fichiers temporaires (dont beaucoup sont créés à partir d’un WSDL) qui s’exécutent au-delà de cette limite. Notre script ant est en quelque sorte capable de les supprimer lors d'un nettoyage, mais parfois, je dois supprimer le répertoire de la zone de travail (où sont stockés tous les fichiers temporaires) sans effectuer un nettoyage complet à partir de ant.

Ce sont les mêmes erreurs cette question , mais les réponses ne fonctionnent pas vraiment pour moi car je traite avec un répertoire, pas un fichier, et je ne sais pas toujours quels fichiers ou sous-répertoires spécifiques causent le problème. Et j'essaie d'éviter tout processus manuel (autre que le déclenchement d'une seule commande) pour les supprimer.

Si j'essaie de supprimer le répertoire de l'explorateur, le message d'erreur s'affiche

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>

Est-ce que quelqu'un connaît des outils ou des moyens simples de contourner cette erreur de suppression sans avoir à rechercher manuellement les fichiers problématiques et à les déplacer/renommer?

371
Herms

Je pense avoir trouvé un moyen de supprimer des éléments de cmd. À l’origine, j’ai essayé la commande del, mais cela n’a pas fonctionné. Puis je me suis souvenu de rmdir. Faire ce qui suit:

rmdir /S /Q <dir>

semble avoir fonctionné.

83
Herms

Utilisez le Gestionnaire de fichiers 7-Zip pour les supprimer.

Si vous rencontrez toujours des problèmes, assurez-vous d'utiliser Shift+Delete dans le gestionnaire de fichiers 7-Zip. Sinon, Windows essaie de les déplacer vers la corbeille (ce qui échouera à nouveau).

420
Dentrasi

Aucune des autres réponses (gratuites) ici ne fonctionnait pour moi, mais j'en ai trouvé une sur un autre site:

rimraf <dir>

rimraf est un paquet Node.js , vous devrez donc installer Node.js, qui inclut npm . Ensuite, vous pouvez exécuter:

npm install -g rimraf

Ensuite, vous pouvez exécuter rimraf à partir de la ligne de commande.

J'ai trouvé cette solution car npm lui-même était à l'origine de ce problème en raison de la manière dont il imbrique des dépendances.

Au fait, rimraf tire son nom de la commande UNIX rm -rf, qui supprime de manière récursive des fichiers et des dossiers.

310
jordanbtucker

Il n'y a pas besoin d'installer de programme pour résoudre ce problème.

Ce problème est facilement résolu en utilisant robocopy, préinstallé depuis Windows Vista, lancé en 2006.

Par exemple, il a été rapporté que rmdir /S /Q <dir> a échoué dans certains cas. Il n'est pas nécessaire d'utiliser 7Zip ou tout autre outil tiers. Powershell est une overkill. Cygwin peut fonctionner, mais vous ne l'avez peut-être pas installé. Alors concentrons-nous sur robocopy

L'idée est de

  1. utiliser robocopy pour copier + mis à jour
  2. depuis un nouveau dossier vide
  3. dans le dossier que vous voulez supprimer, la cible.

Après avoir exécuté robocopy, le répertoire cible serait également vide.

Ces instructions sont pour la ligne de commande. Ouvrez simplement la recherche dans Windows, tapez cmd et appuyez sur Entrée.

Supposons que la suppression de target soit:

C:\delete\this folder\with a very long name

Nous procédons comme suit:

  1. Commencez par créer un répertoire vide, f.i. C:\emptyfolder.

    mkdir C:\emptyfolder
    
  2. Copiez + mettez à jour du répertoire vide vers la cible, en utilisant l'option /purge

    robocopy c:\emptyfolder "C:\delete\this folder\with a very long name" /purge
    
  3. Supprimer le répertoire vide. Vous n'en avez plus besoin.

    rmdir c:\emptyfolder
    

Puisqu'il n'y a aucun fichier ou dossier dans le répertoire source (C:\emptyfolder), il supprime simplement les fichiers et les dossiers du répertoire cible (C:\delete\this folder\with a very long name) de manière récursive!

  • Dernier truc: vous pouvez éviter d'écrire à la main

    C:\delete\this folder\with a very long name
    

    En faisant glisser le dossier depuis une fenêtre de l'Explorateur et en le déposant dans la fenêtre Terminal/cmd.

Faites attention : Les fichiers supprimés n'iront pas dans la corbeille ! Une fois supprimés, les fichiers ne peuvent plus être récupérés.

(Extrait de "Chemin trop long? Utilisez Robocopy" de BVLANGEN )

PS: Je me rends compte que cette réponse était là, moins didactiquement. Comment supprimer un fichier sous Windows avec un nom de fichier trop long? [dupliquer]

Benoit ajouté:

Vous devrez peut-être suivre ce processus plusieurs fois pour vous débarrasser de tous les fichiers.

136
hectorpal

L'outil que j'ai utilisé lorsque j'ai eu ce problème était FastCopy . J'ai sélectionné Supprimer tout dans le menu déroulant, sélectionné le répertoire que je voulais supprimer et cliqué sur Supprimer tout .

FastCopy delete dialog screenshot

FastCopy est portable (aucune installation requise) et il existe des versions 32 bits et 64 bits disponibles.

29
braveterry

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

26
gdw2

Sans installer de logiciel supplémentaire, vous pouvez utiliser la commande subst pour créer temporairement un alias dans un répertoire nommé long.

par exemple. Si vous souhaitez supprimer le dossier C:\Very long directory\that exceed\length limit\blah blah blah\abcde\folder to be deleted, vous pouvez utiliser la commande

subst x: "C:\Very long directory\that exceed\length limit\blah blah blah\abcde"

et alors vous pouvez supprimer X:\folder to be deleted dans l'Explorateur Windows ou dans la commande Invite facilement. Pour supprimer l'alias de lettre de lecteur temporaire, utilisez la commande

subst x: /d
24
Kenneth L

Passez de Powershell à la commande en exécutant ci-dessous:

Cmd /C "rmdir /S /Q <dir>" 
22
Karl Glennon

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

  1. Téléchargez et installez la dernière version stable de 7Zip .
  2. Exécutez le gestionnaire de fichiers 7Zip ( 7zfm.exe ).
  3. Dans le gestionnaire de fichiers 7Zip, naviguez afin que vous puissiez voir le nom du dossier que vous souhaitez supprimer (c'est-à-dire que vous vous trouvez dans le dossier parent).
  4. Maintenez le bouton Shift enfoncé.
  5. Cliquez sur le bouton "Supprimer" sur votre clavier ou dans la barre d’outils du gestionnaire de fichiers 7Zip. assurez-vous de maintenir la touche Maj enfoncée .
  6. Cliquez sur le bouton "OK"; assurez-vous de maintenir la touche Maj enfoncée .
18
Mass Dot Net

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 à des chemins longs.
  2. Avec Windows 10, vous pouvez activer la prise en charge des chemins longs pour une utilisation générale. Notez cependant que toutes les applications ne fonctionneront pas avec des chemins longs, vous devez tester les logiciels plus anciens. Seuls les logiciels avec une entrée de manifeste appropriée pourront l'utiliser.

Préfixe long chemin

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

Ceci est souvent appelé à tort dénomination UNC mais ce n’est pas lié à la réalité.

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

\\?\D:\very long path

Les noms UNC sont normalement utilisés pour faire référence à des chemins sur des serveurs distants sous la forme \\servername\path name\file name. Vous pouvez combiner cela avec le préfixe long path afin que: \\?\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 long chemin

Cette option a été ajoutée aux versions récentes de Windows 10. Elle n’est pas, au moment de la rédaction, activée par défaut car elle nécessite une prise en charge spécifique de l’application. Fait intéressant, PowerShell a une prise en charge intégrée, ce qui permet à cette option d’utiliser les longs chemins directement dans les scripts PowerShell.

Vous pouvez l'activer via l'éditeur de stratégie de groupe si vous possédez une version de Windows. Ou vous pouvez simplement utiliser le changement de registre suivant. Comme toujours, veuillez sauvegarder la section du registre que vous modifiez avant de faire quoi que ce soit.

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

Toutes les applications avec des entrées de manifeste appropriées auront désormais accès aux chemins longs standard 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 a signalé un problème avec la clé de registre ci-dessus et j'ai donc fait encore plus de fouilles . Il semble que vous puissiez maintenant définir la prise en charge de nom de fichier long avec une clé système:

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

Ceci ne fonctionne toujours que pour les applications qui sont spécifiquement définies pour l'utiliser (nécessite une entrée dans le fichier manifest.xml de l'application).

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

10
Julian Knight

J'aime la solution cmd. Bien que je veuille partager une autre solution de contournement qui ne fonctionne même que dans l'Explorateur: essayez de raccourcir les noms des dossiers parents avant la suppression: des noms plus courts raccourciront le chemin. Dites, vous avez cette arborescence du dossier:

C: \

.. Projets

.. .. Quelques projets impressionnants au printemps 2014

.. .. .. Quelques activités dans le parc de la ville un vendredi

.. .. .. .. Bla bla bla bla bla bla bla bla bla bla bla bla

.. .. .. .. .. .. Fichiers réels avec des noms longs, aussi

Dans ce cas, vous ne pouvez pas supprimer les dossiers, vous ne pouvez pas non plus supprimer ou renommer les fichiers. Si vous souhaitez supprimer l'intégralité ou une partie de la structure de dossiers, vous pouvez temporairement renommer les dossiers parents et raccourcir le chemin, puis supprimer le dossier. Les noms peuvent être juste des lettres:

C: \

.. Projets

.. .. X

.. .. .. y

.. .. .. .. z

.. .. .. .. .. .. Fichiers réels avec des noms longs, aussi

Dans mon cas, je voulais simplement supprimer tout le dossier avec de nombreux sous-dossiers et fichiers. Donc, je me fichais du nom des dossiers.

8
Anatoly Mironov

La solution 7-Zip fonctionne très bien. Une autre option si vous avez installé git consiste à ouvrir un shell bash et à utiliser:

rm -f

(ou rm -rf pour les dossiers)

7
User

Je suggère Total Commander (shareware, mais continue de fonctionner après la période d’essai avec seulement un écran de démarrage minimal). C’est ainsi que je résous toujours les problèmes nom de fichier trop long.

4

Vous pouvez également les supprimer en utilisant leur nom abrégé équivalent. dir /x vous les montrera.

2
Ian Boyd

J'ai créé un programme Java simple qui utilise robocopy pour supprimer les fichiers. Le pot est un runnable. Pour une sortie supplémentaire, exécutez-le à partir de la ligne de commande.

https://drive.google.com/file/d/0B5pSEjxJvt_1WVp1T3puSm1CNjg/view?usp=sharing

2
CamHart

Bigger Directories est également conçu pour cette tâche.  enter image description here

  • Télécharger
  • Utilise un appel récursif avec RemoveDirectoryW pour supprimer des répertoires existants
  • Utilise son propre référentiel de fichiers pour les répertoires nouvellement créés
  • Les fichiers peuvent être déplacés des répertoires avant la suppression des répertoires contenant.
  • Rapide, bien que la navigation en haut du répertoire soit un clic par répertoire imbriqué
  • Windows XP (SP3) et plus
  • Code non géré non signé sans programme d'installation, avertissement possible de Smartscreen lors de l'exécution à partir du dossier de rechange, par exemple. bureau.

Plus d'infos sur CodeProject .

1
Laurie Stearn

J'ai essayé toutes les autres réponses, mais elles n'ont pas fonctionné (du moins pour moi).

Je suis tombé sur delinfile et j'ai travaillé assez bien et assez rapidement!

Son essai est limité à 3 actions/15 jours, mais il est utilisable si vous souhaitez uniquement supprimer quelques dossiers/fichiers:

1
Jürgen Paul

Vous avez la réponse parfaite ici (pour les fichiers). Fonctionne sous Windows 10.

REM Make sure there is no \ at the end of either path!
robocopy "C:\...\...\...\long\path" "C:\DeleteMe" "FileName" /MOV
REM Note: this ^ can be called many times before...:

REM Finally, recursively delete the higher up DeleteMe directory.
rmdir /S /Q DeleteMe

Voir aussi: https://msdn.Microsoft.com/en-us/library/aa365247.aspx#maxpath

Pas une seule réponse en 4 questions ne suffisait à mes besoins. Vous êtes les bienvenus dans le monde.

1
Andrew

J'ai fait face à ce problème dans Windows 10 et trouvé cette solution facile.

  1. Allez au plus profond de votre arborescence de dossiers.
  2. Glissez-déposez un dossier du milieu de l’arbre au début de celui-ci à l’aide de la barre d’adresse.
  3. Comme dans mon image, glissez-déposez la zone rouge dans la zone verte. (dans ce cas, le chemin est plus court, mais cela fonctionne aussi pour les longs chemins)
  4. Ensuite, votre chemin devient plus court et supprimez comme d'habitude en utilisant la touche Suppr.

 enter image description here

1
Nayana Adassuriya

J'ai finalement découvert comment faire cela via Powershell. Voici les instructions que j'ai suivies pour que cela fonctionne avec Windows 7:

  1. Créez un nouveau dossier appelé NTFSSecurity dans le dossier C:\Utilisateurs\XXXX\Documents\WindowsPowerShell\Modules\NTFSSecurity}, oùXXXXest votre nom d'utilisateur Windows. . Exemple: si mon nom d'utilisateur était "aspnyc", le nouveau dossier serait C:\Utilisateurs\aspnyc\Documents\WindowsPowerShell\Modules\NTFSSecurity.

  2. Téléchargez le package du module PowerShell File System Security - il devrait être disponible sous forme de fichier Zip simple.

  3. Ouvrez une console Powershell, exécutez Get-Module -ListAvailable et assurez-vous que NTFSSecurity apparaît quelque part dans la liste des modules enregistrés.
  4. Dans la console Powershell, exécutez Import-Module NTFSSecurity .
  5. Dans la console Powershell, exécutez Remove-Item2 "YYYY" -Recurse , oùYYYYest le chemin Windows du dossier que vous souhaitez supprimer de manière récursive (par exemple, C:\Patates\Badgers\FolderToDelete).
0
Mass Dot Net

J'ai finalement découvert comment faire cela avec Powershell sous Windows 10 où les noms de fichiers individuels étaient trop longs. Voici les étapes que j'ai suivies pour que cela fonctionne avec Windows 10:

  1. Téléchargez le package du module PowerShell File System Security - il devrait être disponible sous forme de fichier Zip simple.
  2. Extrayez le fichier Zip en tant que dossier NTFSSecurity dans le répertoire C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules.
  3. Ouvrez une console Powershell avec l’élévation administrative (mode admin.a.k.a) et exécutez Get-Module -ListAvailable et assurez-vous que NTFSSecurity apparaît quelque part dans la liste des modules enregistrés.
  4. Run Set-ExecutionPolicy Unrestricted pour ignorer le mode d'exécution signé. Vous devez confirmer cette action avec un Y (es)
  5. Finalement, cd dans le dossier que vous voulez supprimer.
  6. Dans la console Powershell, exécutez Import-Module NTFSSecurity .
  7. Dans la console Powershell, exécutez Remove-Item2 "YYYY" -Recurse , oùYYYYest le chemin Windows relatif ou absolu du dossier que vous souhaitez supprimer de manière récursive (par exemple, C:\Potatoes\Badgers\FolderToDelete).
  8. Vérifiez si cela a fonctionné.
  9. Remettez éventuellement en mode d'exécution signé avec Set-ExecutionPolicy Restricted . Vous devez confirmer cette action avec Y (es).
0
Epicurist

Si vous avez installé Bash sur Ubuntu sous Windows, vous pouvez accéder au répertoire parent dans une invite de commande normale, puis taper:

bash -c "rm -rf dirname_here"

Qui lance bash, supprime récursivement le répertoire de linux où il n'y a aucune restriction de nom de fichier, puis revient à votre invite de commande habituel.

0
Richard Szalay