Comment supprimer des répertoires avec chemin / noms trop long pour supprimer normalement

Windows semble avoir une limite de longueur sur les noms de fichier lors de la tentative de suppression, mais cela n'empêchera pas ces fichiers d'être créés.

Notre processus de génération crée un certain nombre de fichiers temporaires (beaucoup de build off d'un WSDL) qui sont en conflit avec cette limite. Notre script ant est en quelque sorte capable de les supprimer lors d'un nettoyage, mais parfois j'ai besoin de supprimer le répertoire de la zone de travail (où sont tous les fichiers temporaires) sans vraiment faire un nettoyage complet de la fourmi.

C'est la même erreur que cette question , mais les réponses là ne fonctionnent pas vraiment pour moi car je traite 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 déclencher une seule commande) pour les supprimer.

Si j'essaie de supprimer le répertoire de l'Explorateur, j'obtiens l'erreur

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 faciles de contourner cette erreur de suppression sans devoir trouver manuellement les fichiers problématiques et les déplacer / les renommer?

    Téléchargez 7zip , son gestionnaire de fichiers peut les supprimer. Inestimable si vous utilisez quelque chose comme Cobian Backup, ce qui a une mauvaise habitude de créer de longs chemins …

    Des commentaires:

    Si vous avez toujours des problèmes, assurez-vous d'utiliser shift + del. C'est parce que Windows essaie de déplacer ces fichiers vers la Corbeille.

    Aucune des autres réponses (gratuites) ici n'a fonctionné pour moi, mais j'ai trouvé un sur un autre site:

     rimraf <dir> 

    Rimraf est un paquet Node.js , donc vous devrez 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 parce que npm elle-même causait ce problème en raison de la façon dont elle niche les dépendances.

    Au fait, rimraf obtient son nom de la commande UNIX rm -rf , qui supprime récursivement les fichiers et les dossiers.

    Il n'est pas nécessaire d'installer un programme pour résoudre ce problème.

    Ce problème est facilement résolu à l'aide de robocopy , préinstallé depuis Windows Vista, lancé en 2006.

    Par exemple, rmdir /S /Q <dir> a été signalé comme ayant é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 pouvez pas l'installer. Alors, concentrons-nous sur le robocopy

    L'idée est de

    1. Utiliser robocopy pour copier + mis à jour
    2. À partir d'un nouveau dossier vide
    3. Au dossier que vous souhaitez supprimer, la cible.

    Après avoir exporté un 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.

    Disons que le dossier que nous voulons supprimer, la cible, est

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

    1. Créez d'abord un répertoire vide, fi C:\emptyfolder .

      Mkdir C: \ folder vide

    2. Copier + mise à jour du répertoire vide vers la cible, en utilisant l'option "/ purge"

      Robocopy c: \ emptyfolder "C: \ delete \ ce dossier \ avec un nom très long" / purge

    3. Supprimez le répertoire vide. Vous n'en avez plus besoin.

      Rmdir c: \ emptyfolder

    Comme il n'y a pas de fichiers ou de dossiers dans le répertoire source ( C:\emptyfolder ), il supprime simplement les fichiers et les dossiers sous le répertoire cible ( C:\delete\this folder\with a very long name ).

    • Astuce finale: vous pouvez éviter d'écrire à la main

      C: \ delete \ this folder \ avec un nom très long

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

    Attention : les fichiers supprimés ne vont pas au dossier de la corbeille . Une fois supprimés, les fichiers ne peuvent pas être récupérés.

    (Tiré de "Chemin trop long? Utiliser Robocopy" par BVLANGEN )

    Je crois que j'ai trouvé un moyen de supprimer des choses de cmd . À l'origine, j'ai essayé la commande del , mais cela ne fonctionnait pas. Ensuite, je me suis souvenu de rmdir . Faire ce qui suit:

     rmdir /S /Q <dir> 

    Semble avoir fonctionné.

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

    Capture d'écran de la boîte de dialogue FastCopy delete

    FastCopy est portable (pas d'installation requise), et il existe des versions 32 bits et 64 bits disponibles.

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

    Il suffit de passer de Powershell en commande en exécutant ci-dessous:

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

    La solution de Dentrasi est ce qui a bien fonctionné pour moi, mais j'ai voulu afficher les étapes précises dans une réponse de haut niveau.

    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 pour que vous puissiez voir le nom du dossier que vous souhaitez supprimer (c.-à-d. Dans le dossier parent).
    4. Maintenez le bouton Shift enfoncé.
    5. Cliquez sur le bouton " Supprimer ", soit sur votre clavier, soit dans la barre d'outils du Gestionnaire de fichiers 7zip; Assurez-vous que vous maintenez la touche Maj enfoncée .
    6. Cliquez sur le bouton " OK "; Assurez-vous que vous maintenez la touche Maj enfoncée .

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

    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 puis vous pouvez supprimer X:\folder to be deleted dans l'Explorateur Windows ou dans l'invite de commande facilement. Pour supprimer l'alias de la lettre de lecteur temporaire, utilisez la commande

     subst x: /d 

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

    C: \

    .. Projets

    .. .. Quelque génial projet 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 de longs noms, aussi

    Dans ce cas, vous ne pouvez pas supprimer les dossiers, vous ne pouvez pas supprimer ou renommer les fichiers. Si vous souhaitez supprimer la structure de dossier entière ou une partie de celle-ci, vous pouvez renommer temporairement les dossiers parents et raccourcir le chemin, puis supprimer le dossier. Les noms ne peuvent être que des lettres:

    C: \

    .. Projets

    .. .. X

    … .. ..

    .. .. .. .. z

    … .. .. .. .. Fichiers réels avec de longs noms, aussi

    Dans mon cas, je voulais simplement supprimer le dossier entier avec de nombreux sous-dossiers et fichiers. Donc, je me souciais des noms des dossiers.

    Il y a deux choses qui n'ont pas déjà été mentionnées dans les réponses existantes.

    1. Vous pouvez utiliser un préfixe de chemin de longueur étendue pour accéder à de longs chemins
    2. Avec Windows 10, vous pouvez activer le support de long chemin pour une utilisation générale – notez cependant que toutes les applications ne fonctionneront pas avec de longs chemins, vous devriez tester un logiciel plus ancien. Seul le logiciel avec une entrée de manifeste appropriée pourra l'utiliser.

    Préfixe Long Chemin

    L'API Windows possède une fonction spéciale qui prend en charge les noms de chemin Unicode jusqu'à 32k caractères (chaque élément mesure jusqu'à 255 caractères).

    Ceci est souvent appelé à tort sous le nom UNC, mais ce n'est pas grave.

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

     \\?\D:\very long path 

    Les noms UNC sont normalement utilisés lors de la référence aux chemins sur les serveurs distants sous la forme \\servername\path name\file name . Vous pouvez combiner ceci avec le préfixe long chemin, donc: \\?\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

    Soutien long chemin

    Il s'agit d'une option qui a été ajoutée aux versions récentes de Windows 10. Ce n'est pas, au moment de la rédaction, activé par défaut puisqu'il nécessite un support d'application spécifique. Fait intéressant, PowerShell a un support intégré afin d'activer cette option permettra d'utiliser de longs chemins directement dans les scripts PowerShell.

    Vous pouvez l'activer via l'éditeur de stratégie de groupe si vous avez une version de Windows avec cela. 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 Politiques et sélectionnez Nouveau> Dword (32 bits) dans le menu.
    6. Définissez LongPathsEnabled sur 1 pour activer.

    Toutes les applications avec les entrées de manifeste appropriées auront désormais accès aux chemins longs standard POSIX. Cela devrait inclure les applications 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 souligné un problème avec la clé de registre ci-dessus, donc j'ai fait un peu plus de creusement . Il semble que vous pouvez maintenant définir un support de nom de fichier long avec une clé système:

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

    Cela fonctionne toujours uniquement pour les applications qui sont spécifiquement configurées pour l'utiliser (nécessite une entrée dans manifeste.xml de l'application).

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

    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 nag). C'est la manière dont je résolus toujours les problèmes trop longs .

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

    rm -f

    (Ou rm -rf pour les dossiers)

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

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

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

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

    J'ai découvert Delinfile et j'ai travaillé très bien et assez rapidement!

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

    Les plus grands répertoires sont également conçus pour cette tâche. Entrez la description de l'image ici

    • Télécharger
    • Utilise un appel récursif avec RemoveDirectoryW pour supprimer les répertoires existants
    • Utilise son propre dépôt de fichiers pour les répertoires nouvellement créés
    • Les fichiers peuvent être déplacés depuis les répertoires avant la suppression des répertoires.
    • Speedy, bien que la navigation vers le haut du répertoire soit un clic par annuaire imbriqué
    • Windows XP (SP3) et en haut
    • Code non géré non géré sans installateur, donc possible Alarme Smartscreen lors de l'exécution à partir d'un dossier de rechange, par exemple, sur le bureau.

    Plus d'informations sur CodeProject .

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

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

    2. Téléchargez le module du module PowerShell de sécurité du système de fichiers – 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 s'affiche 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ù YYYY est le chemin d'accès Windows au dossier que vous souhaitez supprimer récursivement (p. Ex. C: \ Potatoes \ Badgers \ FolderToDelete ).

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

    1. Téléchargez le module du module PowerShell de sécurité du système de fichiers – 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 (aka Mode Admin) et exécutez Get-Module -ListAvailable et assurez-vous que NTFSSecurity s'affiche quelque part dans la liste des modules enregistrés.
    4. Run Set-ExecutionPolicy Non restreint pour contourner le mode d'exécution signé. Vous devez confirmer cette action avec un Y (es)
    5. Cochez finalement le dossier que vous souhaitez supprimer.
    6. Dans la console Powershell, exécutez Import-Module NTFSSecurity .
    7. Dans la console Powershell, exécutez Remove-Item2 "YYYY" -Recurse , où YYYY est le chemin relatif ou absolu de Windows vers le dossier que vous souhaitez supprimer récursivement (p. Ex. C: \ Potatoes \ Badgers \ FolderToDelete ).
    8. Vérifiez si cela a fonctionné.
    9. Finalement, revenir au mode d'exécution signé avec Set-ExecutionPolicy Restricted . Vous devez confirmer cette action avec Y (es).

    J'ai rencontré ce problème dans Windows 10 et j'ai trouvé cette solution facile.

    1. Accédez à un peu plus loin de votre arbre de dossiers.
    2. Faites glisser et déposez un dossier d'un milieu quelconque de l'arbre vers un début de l'arborescence à l'aide de la barre d'adresse.
    3. Comme dans mon image glisser et déposer boîte rouge à la boîte verte. (Dans ce cas, le chemin est plus court, mais pour les longs chemins, cela fonctionne aussi)
    4. Ensuite, votre chemin devient plus court et supprimez normalement en utilisant la touche de suppression.

    Entrez la description de l'image ici

    Si vous avez Bash sur Ubuntu sur Windows installé, vous pouvez copier dans le répertoire parent dans une invite de commande régulière, puis tapez:

     bash -c "rm -rf dirname_here" 

    Ce qui lance bash, supprime récursivement le répertoire à partir de linux où il n'y a pas de restrictions de nom de fichier, puis retourne à votre invite de commande ordinaire.