Comment supprimer un dossier dont le nom se termine par un point («.»)?

89

J'ai des dossiers créés par des logiciels malveillants dont le nom se termine par un point comme C:\a.\ou C:\b.\, etc.

J'ai trouvé une solution qui peut supprimer un tel dossier avec une commande, rd /q /s "C:\a.\"mais si j'appelle win API RemoveDirectory, elle revient ERROR_FILE_NOT_FOUND.

Et je me demande simplement comment écrire une fonction pour supprimer un tel répertoire, merci

Je teste sur mon propre système Windows XP SP3 comme celui-ci

créer un dossier C:\>mkdir a..\\\et je ne peux pas double-cliquer pour accéder à ce dossier. et je peux supprimer avec la commande rd /q /s "C:\a.\"

quelle (s) API système Windows cette rd /q /scommande appelle-t-elle?

jerry.liu
la source
Je ne peux pas croire que cela se produit toujours dans Windows 10, par la mise à jour de Windows elle-même (il n'a pas pu supprimer le Windows.old après la mise à jour).
Damn Vegetables

Réponses:

147

Voici une solution à ce problème :

rd /s "\\?\C:\Documents and Settings\User\Desktop\Annoying Folder."
Skilldrick
la source
1
La question veut qu'une fonction API supprime le dossier et indique qu'il peut être supprimé avec rd.
Jcl
4
Assez juste - c'est peut-être pourquoi ce n'est pas marqué comme la réponse acceptée, mais c'est néanmoins très utile pour ceux qui utilisent le même problème mais où nous pouvons utiliser rd.
david.barkhuizen
2
Vous venez de sauver mes nerfs. Merci! : D
Benny Neugebauer
8
Notez que cela ne fonctionne qu'à partir de CMD.exe PAS PowerShell
Lorne K
2
essayez également de fonctionner CMD.exeen mode administrateur aussi si cela ne fonctionne pas dans l'invite de commande non élevée
greg
63

Solution: lorsque vous appelez RemoveDirectory, assurez-vous que vous préfixez le chemin avec la chaîne " \\?\".


Explication: Cela a tout à voir avec le point. Selon MSDN, il existe certains cas où vous ne pourrez peut-être pas supprimer un fichier ou un dossier sur un volume NTFS, en particulier lorsque le nom de fichier n'est pas valide dans l'espace de noms Win32 (c'est pourquoi vous ne pouvez pas ouvrir le fichier à l'aide du méthodes normales dans l'Explorateur Windows).

Il se peut que vous ne puissiez pas supprimer un fichier si le nom de fichier comprend un nom non valide (par exemple, le nom de fichier comporte un espace ou un point de fin ou le nom de fichier est uniquement constitué d'un espace). Pour résoudre ce problème, utilisez un outil qui utilise la syntaxe interne appropriée pour supprimer le fichier. Vous pouvez utiliser la syntaxe "\\? \" Avec certains outils pour opérer sur ces fichiers, par exemple:
del "\\? \ c: \ chemin_au_fichier_qui contient un espace.txt de fin"
La cause de ce problème est similaire à la cause 4. Toutefois, si vous utilisez la syntaxe Win32 typique pour ouvrir un fichier qui contient des espaces de fin ou des points de fin dans son nom, les espaces ou les points de fin sont supprimés avant l'ouverture du fichier réel. Par conséquent, si vous avez deux fichiers dans le même dossier nommé «AFile.txt» et «AFile.txt» (notez l'espace après le nom de fichier), si vous essayez d'ouvrir le deuxième fichier à l'aide d'appels Win32 standard, vous ouvrez le premier fichier à la place. De même, si vous avez un fichier dont le nom est simplement "" (un caractère espace) et que vous essayez de l'ouvrir à l'aide d'appels Win32 standard, vous ouvrez le dossier parent du fichier à la place. Dans ce cas, si vous essayez de modifier les paramètres de sécurité sur ces fichiers, vous ne pourrez peut-être pas le faire ou vous pouvez modifier de manière inattendue les paramètres sur différents fichiers.

(Source: http://support.microsoft.com/?kbid=320081 )

Cody Gray
la source
Cela a fonctionné parfaitement pour moi pour supprimer un fichier avec son nom se terminant par ".". Merci beaucoup !
AFract le
1
Cela a fonctionné en passant de del à rd likerd "\\?\C:\Users\ahmed\Desktop\buggy."
guneysus
Cela fonctionne très bien sur cmd, mais existe-t-il un équivalent pour PowerShell? rddans pwsh est un alias remove-itemdont ne prend pas en charge `\\? \`.
Kagami Sascha Rosylight
1
Bien sûr que oui. Je viens d'utiliser le rd de PowerShell pour supprimer un tel fichier, et cela a très bien fonctionné. Vérifiez votre syntaxe.
SilverbackNet
Sensationnel. {IncrementalNumber}.Je suis tombé sur ce problème en essayant de faire du traitement du langage naturel sur un ensemble de données (chaque fichier de l'ensemble de données est nommé ), et j'étais très confus quant à la raison pour laquelle mes scripts de traitement de données échouaient. Cela a maintenant du sens, mais il semble que le comportement soit si inattendu qu'il pourrait avoir des ramifications de sécurité en raison de la mauvaise gestion des noms de fichiers par les applications se terminant par un espace ou un point.
Spencer D le
46

J'ai posté ceci sur SU et j'ai décidé de le publier ici aussi. C'est le moyen le plus simple, le plus rapide et le plus simple d'y parvenir. Je ris maintenant de voir à quel point c'est simple.

  1. Installez WinRAR
  2. Suivez la procédure étape par étape à partir des images:
  3. entrez la description de l'image ici
  4. entrez la description de l'image ici
  5. entrez la description de l'image ici
  6. entrez la description de l'image ici

J'ai moi-même installé WinRaR, alors j'ai décidé de montrer la solution de contournement.
Cette solution de contournement est également possible en utilisant 7zip.

Une autre chose que je dois mentionner est que, comme il semble que le problème est causé par l'utilisation de l'explorateur Windows et tout autre navigateur de fichiers (comme le navigateur de fichiers winrar lui-même, les explorateurs ftp, etc.) traitera ces fichiers comme normaux.
Vous pouvez essayer d'utiliser n'importe quel navigateur de fichiers et simplement supprimer ces fichiers sans vous soucier de les archiver! À votre santé!

AmirHossein
la source
6
Quelle solution créative!
Nosgoroth
8

Lorsque vous voyez le nom est "a.", Mais le nom réel est "a .."

Essaye ça:

rd /q /s "C:\a..\"

Et vous pouvez essayer d'explorer le dossier avec ce code:

for /f "tokens=3 delims=<>" %%a in ('dir /ad /x "C:\*" ^| findstr " a\.\.$"') do (
  for /f "tokens=1" %%b in ("%%a") do start "" "%%~fb"
)
néorobine
la source
8

Si vous avez installé git (vous pouvez obtenir ir à partir d' ici ), c'est aussi simple que:

  1. Naviguez dans l'Explorateur de fichiers jusqu'à l'emplacement où se trouve le dossier problématique.
  2. Menu contextuel (bouton droit de la souris)> Git Bash Here.
  3. rm -rf Foldername./
Laurynas Lazauskas
la source
rm: cannot remove ‘.bin’: Directory not empty
Vert
@Green si vous avez les autorisations pour supprimer le contenu du dossier, la -rfpartie doit s'occuper du contenu du dossier.
Laurynas Lazauskas
5

J'ai utilisé " WinRar " Un simple processeur RAR, ZIP. Vous pouvez utiliser n'importe quel type d'éditeur de nom de fichier. Ouvrez simplement le répertoire où se trouve votre fichier dans WinRar et sélectionnez Renommer après avoir cliqué avec le bouton droit sur le fichier / dossier que vous souhaitez renommer et indiquez le nouveau nom.

aryen
la source
Comment est-ce censé aider?
Tavo
1
Vous aide à parcourir le fichier / dossier et à renommer le fichier en quelque chose ... et c'est fait.
Aryan
1
Cela m'a vraiment aidé; J'avais utilisé WinRar pour décompresser un tas de fichiers, dont l'un comprenait un dossier se terminant par un point. Windows ne pouvait pas le supprimer ou vraiment le renommer, mais je pouvais le renommer sans problème dans WinRar, puis le supprimer dans l'Explorateur Windows (win 10). Merci!
Nick mai
2

Essayez d'utiliser le programme de déverrouillage pour supprimer les fichiers et les dossiers que vous ne pouvez pas supprimer normalement.

RyuuGan
la source
3
Je suis curieux de savoir comment le déverrouillage peut faire cela!
jerry.liu
0

Utilisez la commande bash rm d'Ubuntu sous Windows 10

Kreker
la source
rm: cannot remove ‘.bin’: Directory not empty
Vert
0

si vous souhaitez conserver les fichiers, il existe également des options dans bash.
vous aurez besoin du sous-système Windows pour le package Linux (j'ai installé Ubuntu)

pour conserver les fichiers. ouvrez une invite de commande et accédez à l'emplacement du fichier ou du dossier.
maintenant tapez " bash"
cela ouvrira bash dans l'invite. maintenant entrez mv '[folder or file you want to move]' '[new name (can include path)]'(il y a plus à mv donc si vous voulez lire toutes ses options, utilisez 'man mv' cela ouvrira sa page de manuel (puis utilisez q pour revenir à bash))
la commande mv est l'abréviation de move, mais son a une fonction secondaire de renommer les choses.
également dans bash, utilisez des "guillemets simples" et non un "guillemet double" normal, car bash s'attend à des "guillemets simples".

voici un exemple. Supposons que votre dossier est nommé " data 1." situé dans c:\users(le chemin complet vers le dossier d'erreur est donc c:\users\data 1.
1. ouvrez l'invite de commande en utilisant n'importe quelle méthode
2. entrez cd c:\users
3. maintenant tapez bashce charge bash dans le dossier dans lequel vous étiez auparavant
4. tapez enfin mv 'data 1.' 'data 1'
5. le dossier est maintenant accessible et vous pouvez choisir de le supprimer.

mer2329
la source