¿Cómo eliminar una carpeta cuyo nombre termina con un punto (".")?

89

Obtuve algunas carpetas creadas por malware cuyo nombre terminaba con un punto como C:\a.\o C:\b.\, etc.

Encontré una solución que puede eliminar dicha carpeta con el comando, rd /q /s "C:\a.\"pero si llamo a Win API RemoveDirectory, regresa ERROR_FILE_NOT_FOUND.

Y me pregunto cómo escribir una función para eliminar ese directorio, gracias

Pruebo en mi propio sistema Windows XP SP3 como este

creo una carpeta C:\>mkdir a..\\\y no puedo hacer doble clic para acceder a esta carpeta. y puedo eliminar con comando rd /q /s "C:\a.\"

¿A qué API (s) del sistema Windows rd /q /sllama ese comando?

jerry.liu
fuente
No puedo creer que esto todavía suceda en Windows 10, por la propia actualización de Windows (no pudo eliminar Windows.old después de la actualización).
Damn Vegetables

Respuestas:

147

Aquí tienes una solución a este problema :

rd /s "\\?\C:\Documents and Settings\User\Desktop\Annoying Folder."
Skilldrick
fuente
1
La pregunta quiere que una función de API elimine la carpeta y establece que se puede eliminar con rd.
Jcl
4
Bastante justo, tal vez por eso no está marcado como la respuesta aceptada, pero de todos modos es muy útil para aquellos que usan el mismo problema pero donde podemos usar rd.
david.barkhuizen
2
Me acaba de salvar los nervios. ¡Gracias! : D
Benny Neugebauer
8
Tenga en cuenta que esto solo funciona desde CMD.exe NO PowerShell
Lorne K
2
También intente ejecutar CMD.exeen modo administrador si no funciona en el símbolo del sistema no elevado
Greg
63

Solución: cuando llame a RemoveDirectory, asegúrese de anteponer la ruta con la cadena " \\?\".


Explicación: Tiene mucho que ver con el punto. Según MSDN, hay ciertos casos en los que es posible que no pueda eliminar un archivo o carpeta en un volumen NTFS, específicamente cuando el nombre del archivo no es válido en el espacio de nombres de Win32 (razón por la cual no puede abrir el archivo con el métodos normales en el Explorador de Windows).

Es posible que no pueda eliminar un archivo si el nombre del archivo incluye un nombre no válido (por ejemplo, el nombre del archivo tiene un espacio al final o un punto al final o el nombre del archivo se compone únicamente de un espacio). Para resolver este problema, utilice una herramienta que utilice la sintaxis interna adecuada para eliminar el archivo. Puede utilizar la sintaxis "\\? \" Con algunas herramientas para operar en estos archivos, por ejemplo:
del "\\? \ c: \ ruta_al_archivo_que contiene un espacio final.txt"
La causa de este problema es similar a la Causa 4. Sin embargo, si usa la sintaxis típica de Win32 para abrir un archivo que tiene espacios o puntos finales en su nombre, los espacios o puntos finales se eliminan antes de abrir el archivo real. Por lo tanto, si tiene dos archivos en la misma carpeta denominados "AFile.txt" y "AFile.txt" (tenga en cuenta el espacio después del nombre del archivo), si intenta abrir el segundo archivo mediante llamadas estándar de Win32, abra el primer archivo en su lugar. De manera similar, si tiene un archivo cuyo nombre es simplemente "" (un carácter de espacio) e intenta abrirlo mediante llamadas estándar de Win32, en su lugar abre la carpeta principal del archivo. En esta situación, si intenta cambiar la configuración de seguridad en estos archivos, es posible que no pueda hacerlo o que cambie inesperadamente la configuración en diferentes archivos.

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

Cody Grey
fuente
Me funcionó perfectamente para eliminar un archivo con su nombre terminado por ".". Muchas gracias !
AFract
1
Funcionó cambiando del a rd likerd "\\?\C:\Users\ahmed\Desktop\buggy."
guneysus
Esto funciona muy bien en cmd, pero ¿existe un equivalente para PowerShell? rden pwsh hay un alias remove-itemque no admite `\\? \`.
Kagami Sascha Rosylight
1
Claro que sí. Acabo de usar la rd de PowerShell para eliminar dicho archivo, y funcionó bien. Verifique su sintaxis.
SilverbackNet
Guau. Me encontré con este problema al intentar hacer un procesamiento de lenguaje natural en un conjunto de datos (cada archivo del conjunto de datos tiene un nombre {IncrementalNumber}.), y estaba muy confundido acerca de por qué fallaban mis scripts de procesamiento de datos. Esto ahora tiene sentido, pero parece que el comportamiento es tan inesperado que podría tener ramificaciones de seguridad debido a que las aplicaciones manejan incorrectamente los nombres de archivo que terminan en un espacio o punto.
Spencer D
46

He publicado esto en SU ​​y decidí publicarlo aquí también. Es la forma más sencilla, rápida y sencilla de conseguirlo. Ahora me río de lo simple que es.

  1. Instalar WinRAR
  2. Siga el procedimiento paso a paso de las imágenes:
  3. ingrese la descripción de la imagen aquí
  4. ingrese la descripción de la imagen aquí
  5. ingrese la descripción de la imagen aquí
  6. ingrese la descripción de la imagen aquí

Yo mismo tenía instalado WinRaR, así que decidí demostrar la solución.
Esta solución alternativa también es posible utilizando 7zip.

Otra cosa que debo mencionar es que, como parece que el problema se debe al uso del explorador de Windows y cualquier otro explorador de archivos (como el explorador de archivos winrar, exploradores de ftp, etc.) tratará estos archivos de forma normal.
¡Puede intentar usar cualquier navegador de archivos y simplemente eliminar esos archivos y no molestarse en archivarlos! ¡Salud!

AmirHossein
fuente
6
¡Qué solución tan creativa!
Nosgoroth
8

Cuando vea que el nombre es "a.", Pero el nombre real es "a .."

Prueba esto:

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

Y puede intentar explorar la carpeta con este código:

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

Si tiene instalado git (puede obtenerlo desde aquí ), entonces es tan simple como:

  1. Navegue el Explorador de archivos a la ubicación donde se encuentra la carpeta problemática.
  2. Menú contextual (botón derecho del mouse)> Git Bash Here.
  3. rm -rf Foldername./
Laurynas Lazauskas
fuente
rm: cannot remove ‘.bin’: Directory not empty
Verde
@Green si tiene permisos para eliminar el contenido de la carpeta, la -rfparte debe encargarse del contenido de la carpeta.
Laurynas Lazauskas
5

Usé " WinRar " Un simple procesador ZIP, RAR. Puede utilizar cualquier tipo de editor de nombre de archivo. Simplemente abra el directorio donde está su archivo en WinRar y seleccione cambiar el nombre después de hacer clic con el botón derecho en el archivo / carpeta que desea cambiar el nombre y complete el nuevo nombre.

ario
fuente
¿Cómo se supone que eso ayudará?
Tavo
1
Le ayuda a explorar el archivo / carpeta y cambiar el nombre del archivo a lo que sea ... y listo.
Aryan
1
Esto realmente me ayudó; Había usado WinRar para descomprimir un montón de archivos, uno de los cuales incluía una carpeta que terminaba en un punto. Windows no pudo eliminarlo o realmente cambiarle el nombre, pero pude renombrarlo sin problemas en WinRar y luego eliminarlo en el Explorador de Windows (win 10). ¡Gracias!
Nick May
2

Intente utilizar el programa de desbloqueo para eliminar archivos y carpetas que no puede eliminar normalmente.

RyuuGan
fuente
3
¡Tengo curiosidad por saber cómo puede hacer esto el desbloqueador!
jerry.liu
0

Use el comando bash rm de Ubuntu en Windows 10

kreker
fuente
rm: cannot remove ‘.bin’: Directory not empty
Verde
0

si desea mantener los archivos, también hay opciones en bash.
necesitará el paquete Subsistema de Windows para Linux (tengo Ubuntu instalado)

para guardar los archivos. abra un símbolo del sistema y vaya al lugar donde se encuentra el archivo o carpeta.
ahora escribe " bash"
esto abrirá bash en el indicador. ahora ingrese mv '[folder or file you want to move]' '[new name (can include path)]'(hay más en mv, así que si desea leer todas sus opciones, use 'man mv', esto abrirá su página de manual (luego use q para regresar a bash))
el comando mv es la abreviatura de move, pero es tiene la función secundaria de cambiar el nombre de las cosas.
también en bash use 'comillas simples' y no una "comilla doble" normal, ya que bash espera 'comillas simples'.

aquí hay un ejemplo. suponga que su carpeta se llama " data 1." ubicada en c:\users(por lo que la ruta completa a la carpeta de error es c:\users\data 1.
1. abra el símbolo del sistema usando cualquier método
2. ingrese cd c:\users
3. ahora escriba bashesto carga bash en la carpeta en la que estaba anteriormente
4. finalmente escriba mv 'data 1.' 'data 1'
5. ahora se puede acceder a la carpeta y puede optar por eliminarla.

mer2329
fuente