76 votes

Comment supprimer un dossier qui est imbriqué assez profondément et éviter le "File name too long" ?

Eclipse a créé un dossier temporaire dans l'un des répertoires qui est imbriqué assez profondément, par ex.

dir1\dir1\dir1\dir1\...

Je ne parviens pas à supprimer ce dossier dans Windows via l'Explorateur, la del o rmdir ni la commande 'rm' de Cygwin. Comment dois-je supprimer ce très long dossier ?

Le message "Nom de fichier trop long..." s'affiche.

111voto

jofafrazze Points 1161

Si vous êtes comme moi et que vous n'aimez pas installer un logiciel supplémentaire pour résoudre un problème comme celui-ci, je choisirais la solution suivante Suggestion de XQYZ et utiliser robocopy pour résoudre le problème. (Dans mon cas, le problème a été créé par robocopy en premier lieu, en copiant un répertoire qui avait des points de jonction récursifs sans fournir /XJ à robocopy).

Pour supprimer l'arborescence des répertoires commençant à c : \subdir\more\offending_dir :

Le processus complet, étape par étape, est aussi simple que ceci :

  1. cd c:\subdir\more pour accéder à son répertoire parent.
  2. mkdir empty pour créer un répertoire vide.
  3. robocopy empty offending_dir /mir pour faire un miroir du répertoire vide dans le répertoire en question.
  4. Après un peu d'attente, vous avez terminé ! Finissez-le avec :
  5. rmdir offending_dir pour se débarrasser du répertoire offensant maintenant vide et
  6. rmdir empty pour vous débarrasser de votre répertoire vide intermédiaire.

39voto

Ben Collins Points 11318

Ce problème est en fait assez simple à résoudre. Disons que la structure du répertoire est la suivante :

C:\Dir1\Dir1\Dir1\Dir1…

Pour y remédier, il suffit de renommer chaque dossier en un nom de dossier à un caractère jusqu'à ce qu'il ne soit plus trop long à supprimer :

  1. Renommer C:\Dir1 a C:\D
  2. Naviguez vers C:\D\
  3. Renommer C:\D\Dir1 a C:\D\D
  4. Naviguez vers C:\D\D\
  5. Goto 1 jusqu'à ce que la longueur totale du chemin soit <260

Voici un fichier batch pour automatiser le processus (cette version simple est la meilleure pour les répertoires simples comme celui décrit dans la question, surtout pour les répertoires jetables). Passez-lui le dossier le plus élevé possible (par exemple C:\Dir1 para C:\Dir1\Dir1\Dir1… o C:\Users\Bob\Desktop\New Folder pour C:\Users\Bob\Desktop\New Folder\abcdefghi… )

@echo off
if not (%1)==() cd %1
for /D %%i in (*) do if not %%i==_ ren "%%i" _
pushd _ 
%0 
popd

Explication technique

Les autres solutions proposées sont à l'envers ; on ne peut pas régler le problème en partant du répertoire le plus intime vers l'extérieur, il faut aller dans l'autre sens.

Lorsque vous essayez d'accéder à un répertoire, vous le faites en utilisant son chemin absolu, explicitement ou non, qui inclut tout ce qui le précède. Par conséquent, pour une structure de répertoire telle que C:\Dir1\Dir1\Dir1\Dir1 la longueur de la trajectoire jusqu'à l'élément le plus à l'intérieur. Dir1 est de 22. Cependant, la longueur du chemin jusqu'à l'endroit le plus extérieur Dir1 n'est que de 7, et reste donc accessible quel que soit son contenu (dans le contexte du chemin d'accès d'un répertoire donné, le système de fichiers n'a aucune connaissance de ce qu'il contient ou de l'effet qu'il a sur la longueur totale du chemin d'accès de ses répertoires enfants ; seuls ses répertoires ancêtres - vous ne pouvez pas renommer un répertoire si la longueur totale du chemin d'accès est trop longue).

Par conséquent, lorsque vous rencontrez un chemin trop long, ce que vous devez faire, c'est aller au niveau le plus élevé possible et le renommer en un nom à un caractère, puis répéter l'opération pour chaque niveau. À chaque fois, la longueur totale du chemin est réduite de la différence entre l'ancien et le nouveau nom.

L'inverse est également vrai. Vous ne pouvez pas créer un chemin d'accès dont la longueur est supérieure à la longueur maximale prise en charge (sous DOS et Windows, MAX_PATH = 260 ). Cependant, vous pouvez renommer les répertoires, en partant du plus profond vers l'extérieur, avec un nom plus long. Le résultat est que les dossiers plus profonds dont le chemin absolu est >260 seront inaccessibles. (Cela ne les rend pas "cachés" ou sécurisés, car ils sont assez simples à atteindre, donc n'utilisez pas cette méthode pour cacher des fichiers).


Note latérale intéressante

Si vous créez des dossiers dans l'Explorateur de Windows 7, il peut sembler que l'Explorateur vous permette de créer des sous-répertoires de telle sorte que la longueur totale soit plus longue que MAX_PATH Cependant, il s'agit en fait de tricher en utilisant les "noms de fichiers DOS 8.3". Vous pouvez le constater en créant une arborescence telle que la suivante :

C:\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
   \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
    \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
     \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
      \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
       \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
        \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
         \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
          \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
           \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
            \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\

Il comporte 696 caractères, ce qui est bien sûr beaucoup plus long que 260. De plus, si vous naviguez vers le sous-répertoire le plus proche dans l'Explorateur, il l'affiche comme prévu dans la barre d'adresse lorsqu'il n'est pas en focus, mais lorsque vous cliquez dans la barre d'adresse, il change le chemin d'accès en C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ qui ne compte que 102 caractères.

Dans XP, il ne le fait pas, mais refuse obstinément de créer un chemin plus long que celui qui est pris en charge.

Ce qui serait vraiment intéressant, c'est de savoir comment l'Explorateur de Windows 7 gère les "chemins trop longs" lorsque l'option NtfsDisable8dot3NameCreation est définie.

17voto

Torsten Marek Points 27554

Vous pouvez raccourcir le chemin en utilisant subst pour créer un lecteur virtuel :

C:\>subst Z: "C:\TEMP\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1"

Changez dans le lecteur virtuel :

cd Z:

Maintenant vous pouvez supprimer les fichiers :

del *.*

Retirez le lecteur virtuel :

cd C:\TEMP
subst Z: /d

Supprimez le répertoire :

rd /s dir1

10voto

JPJofre Points 101

J'ai écrit une petite application en C# pour m'aider à supprimer une structure similaire très profonde générée par une utilisation négligente de Robocopy et une sauvegarde de Homeserver ; par défaut Robocopy traite les points de jonction comme des dossiers normaux... :-( Vous pouvez vous retrouver avec un gros bordel sans vous en rendre compte.

L'outil est disponible sur CodePlex avec les fichiers sources, pour que chacun puisse l'utiliser.

http://deepremove.codeplex.com

8voto

Rick Strahl Points 439

Il y a quelque temps, j'ai créé un petit utilitaire autonome appelé DeleteFiles que vous pouvez utiliser pour effectuer cette tâche facilement.

En utilisant cet utilitaire autonome, vous pouvez simplement faire :

deletefiles c:\yourfolder\subfolder\*.* -r -f

pour supprimer la structure entière du dossier. -r parcourt la hiérarchie des dossiers depuis le répertoire de départ vers le bas, -f supprime tous les dossiers qui sont vides (ce qui sera le cas de tous les dossiers si vous utilisez la commande . comme spécification de fichier). DeleteFiles supporte des chemins plus longs que la limite MAX_PATH de Windows, ce qui lui permet de fonctionner sans problème avec des dossiers profondément imbriqués.

DeleteFiles est gratuit et open source et vous pouvez récupérer le code binaire ou le code source à l'adresse suivante GitHub ou installer directement en utilisant Chocolaté

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