web-dev-qa-db-fra.com

Sur ma machine Windows, j'avais un dossier avec un nom de quatre points qui ressemblait à une sorte de trou à lapin - comment cela s'est-il passé?

Le nom du dossier était répertorié dans l'Explorateur de fichiers avec simplement quatre points .....

Quand j'ai essayé de l'ouvrir, je suis entré dans une sorte de boucle de trou de lapin sans fin où j'ai ouvert le même dossier encore et encore - je pouvais le faire sans fin. Afficher le chemin comme C:\ExamplePath\....\....\....\....\...., etc.

Il était accroché ma compilation TypeScript dans un projet spécifique. Il m'a fallu plus d'un an avant de trouver ce dossier et ses problèmes, car il était profondément enraciné dans des dossiers imbriqués. Je ne m'attendais jamais à un problème de ce genre, je ne l'ai donc jamais cherché.

Je ne pouvais pas supprimer le dossier normalement, à cause du nom spécial. En fin de compte, je pourrais le supprimer en utilisant la ligne de commande et en supprimant le dossier parent avec rd /s /q path.

Par la suite, j’ai essayé de créer à nouveau le dossier, mais j’ai été incapable de le faire avec l’explorateur de fichiers et la ligne de commande.

Au cours de mes 20 années d’utilisation de Windows, je n’avais jamais vu ce bogue auparavant, alors j’imagine qu’il s’agirait vraiment d’un problème gênant et déroutant pour les utilisateurs amateurs.

Est-ce que quelqu'un sait comment cela aurait pu se produire et comment reproduire ce problème?

Mettre à jour

Pour les personnes intéressées: ce chemin était situé profondément dans un dossier TFS. Donc, probablement TFS utilise la méthode de contournement @grawity expliquée ( "Divers gestionnaires de fichiers, archiveurs, etc." )

Ai-je trébuché sur un rare bug de TFS?

196
Dirk Boer

Win32 ne vous permet pas de créer des fichiers ou des dossiers avec des noms se terminant par . - tous les points sont supprimés de la fin. Essayer de créer test. fait apparaître test à la place. (Ceci concerne la compatibilité avec les noms 8.3 dans les anciens logiciels de l’ère DOS/Win9x.)

Par conséquent, chaque fois que vous essayez d'accéder à un dossier nommé ...., son nom devient réduit à la chaîne vide et vous revenez au dossier dans lequel vous vous trouviez auparavant.

Le noyau NT, cependant, autorise de tels noms. Différents mécanismes permettent de contourner les limitations de nom de fichier imposées par les API Win32. Par exemple, WSL (Windows Subsystem for Linux) ne s'exécute pas sur Win32 et n'est pas affecté par celui-ci. Il existe également la méthode \\?\ bypass, une "porte dérobée" délibérée laissée aux programmes qui savent ce qu’ils font. Même si vous ne pouvez pas créer C:\Example\....\, vous pouvez créer \\?\C:\Example\....\ très bien.

De même, vous pouvez supprimer de tels répertoires avec rmdir \\?\C:\path\... de Cmd (je n'ai pas encore testé avec PowerShell).

Différents gestionnaires de fichiers, archiveurs, etc. peuvent utiliser la méthode \\?\ afin de pouvoir utiliser des noms de chemin plus longs que d'habitude. Ils ne sont donc pas affectés par le code de compatibilité de Win32. ils contournent la suppression de points, ainsi que la traduction de noms de fichiers magiques tels que CON ou NUL.

Donc, il se pourrait que l'un de vos programmes:

  1. utilise toujours \\?\ pour accéder aux fichiers,
  2. accidentellement essayé de créer un dossier nommé .... - mais il n’est pas vraiment possible de savoir avec certitude après coup.
303
grawity

En plus de la réponse de @ grawity, un programme Win32 peut également le faire en appelant directement l'API "native". Si je ne me trompe pas, dans le cas présent, ce serait NtCreateDirectoryObject. Ces appels sont assez bien documentés de nos jours, en particulier leur homologue du noyau (que vous ne pouvez pas appeler depuis un programme Win32), dans ce cas, ZwCreateDirectoryObject.

En ce qui concerne la "profondeur sans fin", un moyen facile d'y parvenir consiste à utiliser des liens. Créez un répertoire, puis à l'intérieur, créez-lui une jonction (vous pouvez utiliser mklink /j par exemple) et vous obtiendrez une structure très profonde. La dernière fois que j'ai fait cela, c'était sous Windows 2000, la récursivité prenait fin (vous ne pouviez pas "creuser à l'infini"). Peut-être que sur les nouveaux systèmes d’exploitation, la limite est plus grande ou supprimée, vous pouvez également créer, par exemple, 10 répertoires, chacun d’eux étant le précédent, et créer un dixième répertoire, le premier.

22
user1532080

Il existe un moyen plus simple de créer le répertoire. A partir de l'invite de commande, tapez:

MD ....\

et appuyez sur Entrée, il créera un répertoire avec quatre points. Ce répertoire est également visible avec Explorer.

Il y a une faille dans MS-DOS qui remonte à la version 1.0. MS est au courant depuis un certain temps, mais ne pourrait pas ou ne voudrait pas le réparer. Ils ont corrigé le problème avec PowerShell.

BTW, si vous essayez:

RD ....

Il ne sera pas supprimé. Vous devez utiliser cette syntaxe spécifique pour la supprimer.

RD ....\

J'utilise ceci sur certains serveurs que j'administre. Je crée souvent un dossier utilisateur à la racine du disque et je ne souhaite pas qu'un autre administrateur vienne le supprimer.

Je vais donc aller dans mon dossier et créer un sous-dossier nommé CON, AUX ou LPT, etc ...

Si un autre administrateur souhaite supprimer mon dossier, il doit d'abord savoir comment supprimer ce sous-dossier.

EDIT: Je pensais à la discussion de ce matin et j'ai décidé d'aller plus loin. Je suppose que les mods décideront si cela est pertinent.

Je ne parviens pas à insérer un CD dans le dossier.

Considérez si je MD c:\test puis CD C:\test et MD ....\Je me retrouve avec C:\test ....

et tout va bien.

Mais CD .... échoue et me renvoie à C:\test. (CD ....\fait la même chose.)

Cependant, je peux DIR .... et obtenir une liste de dir. je peux aussi

MD C:\test ....\temp et il crée ce sous-répertoire dans ....

Je peux aussi CD C:\test ....\temp et aller dans ce sous-sous-répertoire.

Mais alors que dans C:\test ....\temp, si je CD .. je suis de retour dans C:\test.

Je ne peux pas entrer dans ce répertoire, mais je peux manipuler le dossier en créant des sous-dossiers, et assez intéressant, par exemple

ECHO "Test" >> C:\test ....\test.txt

fonctionne également et crée un fichier dans ce dossier. Ainsi, je peux créer un dossier avec quatre points, je peux y ajouter des fichiers et des dossiers, je peux en obtenir la liste des répertoires, mais je ne peux pas y insérer de CD. Pourrait-il y avoir une sorte de génie maléfique utilisé pour cela? Mes excuses aux mods si je me suis égaré trop loin du cap.

17
Larryc