De alguna manera, uno de nuestros viejos cuadros de Server 2008 (no R2) ha desarrollado una carpeta aparentemente infinitamente recurrente. Esto está haciendo estragos con nuestras copias de seguridad, ya que el agente de copia de seguridad intenta volver a la carpeta y nunca regresa.
La estructura de carpetas se parece a:
C:\Storage\Folder1
C:\Storage\Folder1\Folder1
C:\Storage\Folder1\Folder1\Folder1
C:\Storage\Folder1\Folder1\Folder1\Folder1
... y así. Es como uno de esos sets de Mandelbrot con los que solíamos jugar en los años 90.
He intentado:
- Eliminarlo del Explorador. Sí, soy optimista.
RMDIR C:\Storage\Folder1 /Q/S
- esto vuelveThe directory is not empty
ROBOCOPY C:\temp\EmptyDirectory C:\Storage\Folder1 /PURGE
- Esto gira a través de las carpetas durante un par de minutos antes de que robocopy.exe se bloquee.
¿Alguien puede sugerir una forma de eliminar esta carpeta para siempre?
/MIR
lugar:ROBOCOPY /MIR C:\temp\EmptyDirectory C:\Storage\Folder1
también puede valer la pena correrchkdsk
solo por risas/MIR
pareció durar más, pero finalmente fue bombardeado también ("la robocopia ha dejado de funcionar"). Tengo un poco de miedo de hacer unchkdsk
; esto es un servidor bastante viejo y me preocupa que este problema es indicativo de grandes problemas en el sistema de archivos ...find
para hacer una eliminación profunda del primer directorio:find Storage/Folder1 -depth -exec rmdir {} \;
Respuestas:
Gracias a todos por los útiles consejos.
Desviándome bien en el territorio de StackOverflow, resolví el problema al desbloquear este fragmento de código C #. Utiliza la biblioteca Delimon.Win32.IO que trata específicamente los problemas de acceso a rutas de archivos largas.
En caso de que esto pueda ayudar a alguien más, aquí está el código: superó los ~ 1600 niveles de recursión con los que me había quedado atrapado y me llevó alrededor de 20 minutos eliminarlos a todos.
fuente
.Delete
(en lugar de laSystem.IO
versión normal ), y aunque no arrojó una excepción, no pareció hacer nada. Ciertamente, la recursión usando el método anterior tomó años, y.Delete
solo masticó cosas durante 5-10 segundos. ¿Tal vez eliminó algunos directorios y luego se rindió?Podría ser un punto de unión recursivo. Tal cosa se puede crear con
junction
una utilidad de archivo y disco de Sysinternals .Y ahora puede ir sin parar hacia abajo c: \ Hello \ Hello \ Hello .... (bueno, hasta llegar a MAX_PATH, 260 caracteres para la mayoría de los comandos pero 32,767 caracteres para algunas funciones de la API de Windows).
Una lista de directorio muestra que es una unión:
Para eliminar, use la utilidad de unión:
fuente
DIR
solo me muestra directorios simples - no hay signos de ningún cruce, me temojunction -s C:\Storage\Folder1
?No reparse points found
:(dir /a
para ver '<JUNCTION>' sin especificar el nombre específico.No es una respuesta, pero no tengo suficiente representante para un comentario.
Una vez arreglé este problema en un enorme disco FAT16 de 500 MB en un sistema MS-DOS. Usé la depuración de DOS para volcar y analizar manualmente la tabla de directorios. Luego volteé un bit para marcar el directorio recursivo como eliminado. Mi copia de 'Referencia de programadores de DOS' de Dettman y Wyatt me mostró el camino.
Todavía estoy excesivamente orgulloso de esto. Me sorprendería y aterrorizaría si hubiera alguna herramienta de propósito general que tenga tanto poder sobre los volúmenes FAT32 o NTFS. La vida era más simple en aquel entonces.
fuente
Java también puede manejar rutas de archivo largas. Y también puede hacerlo mucho más rápido. Este código (que copié de la documentación de la API de Java) eliminará una estructura de directorio profunda de nivel 1600 en aproximadamente 1 segundo (bajo Windows 7, Java 8.0) y sin riesgo de desbordamiento de la pila, ya que en realidad no usa la recursividad.
fuente
No necesita nombres de ruta largos si ingresa
chdir
al directorio y solo usa rutas relativas armdir
.O, si tiene un shell POSIX instalado, o lo transfiere al equivalente de DOS:
(El uso de una variable de shell para rastrear dónde lo renombró para la condición del bucle es la otra alternativa a desenrollar el bucle como lo hice allí).
Esto evita la sobrecarga de la CPU de la solución de KenD, lo que obliga al sistema operativo a atravesar el árbol desde el nivel superior hasta el
n
nivel th cada vez que se agrega un nuevo nivel, verificando permisos, etc. Por lo tanto, tienesum(1, n) = n * (n-1) / 2 = O(n^2)
complejidad de tiempo. Las soluciones que cortan un fragmento desde el inicio de la cadena deberían serO(n)
, a menos que Windows necesite atravesar un árbol al cambiar el nombre de su directorio principal. (Linux / Unix no lo hace). Las soluciones quechdir
vanchdir
hasta la parte inferior del árbol y usan rutas relativas desde allí, eliminando directorios a medida que se realizan copias de seguridad, también deberían serloO(n)
, suponiendo que el sistema operativo no necesita verificar todos sus directorios principales cada llamada al sistema, cuando haces cosas mientras estás en CD en alguna parte.find Folder1 -depth -execdir rmdir {} +
ejecutará rmdir mientras está en CD en el directorio más profundo. O, en realidad, la-delete
opción find funciona en directorios e implica-depth
. Entoncesfind Folder1 -delete
debería hacer exactamente lo mismo, pero más rápido. Sí, GNU encuentra en Linux desciende escaneando un directorio, CD a subdirectorios con rutas relativas, luegormdir
con una ruta relativa, luegochdir("..")
. No vuelve a escanear directorios mientras asciende, por lo que consumiríaO(n)
RAM.Eso fue realmente una aproximación:
strace
espectáculos que realmente utilizaunlinkat(AT_FDCWD, "tmp", AT_REMOVEDIR)
,open("..", O_DIRECTORY|...)
yfchdir(the fd from opening the directory)
, con un montón defstat
llamadas mezclados, también. Pero el efecto es el mismo si el árbol de directorios no se modifica mientras se está ejecutando find.editar: Solo por diversión, probé esto en GNU / Linux (Ubuntu 14.10, en una CPU Core2Duo de primera generación de 2.4GHz, en un sistema de archivos XFS en una unidad WD 2.5TB Green Power (WD25EZRS)).
(mkdir -p crea un directorio y cualquier componente de ruta faltante).
Sí, realmente 0.05 segundos para 2k rmdir ops. xfs es bastante bueno para agrupar operaciones de metadatos en el diario, ya que repararon que las operaciones de metadatos eran lentas como hace 10 años.
En ext4, crear tomó 0m0.279s, eliminar con find todavía tomó 0m0.074s.
fuente
Me encontré con el mismo problema con un desorden de carpetas de más de 5000 directorios que algunas aplicaciones Java y escribí un programa que te ayudará a eliminar esta carpeta. El código fuente completo está en este enlace:
https://imanolbarba.net/gitlab/imanol/DiREKT
Eliminó todo después de un tiempo, pero logró hacer el trabajo, espero que ayude a las personas que (como yo) se encuentran con el mismo problema frustrante
fuente
Yo también tuve esto, sin embargo, en un sistema Windows 10 independiente. C: \ Usuario \ Nombre \ Repetir \ Repetir \ Repetir \ Repetir \ Repetir \ Repetir \ Repetir aparentemente hasta el infinito.
Podría navegar usando Windows o el símbolo del sistema hasta aproximadamente el número 50 y no más. No pude eliminarlo, ni hacer clic en él, etc.
C es mi lenguaje, así que eventualmente escribí un programa con un ciclo de llamadas al sistema, que se repiten hasta que fallan. Sin embargo, puede hacer esto en cualquier idioma, incluso en lotes de DOS. Hice un directorio llamado tmp y moví Repeat \ Repeat a eso, eliminé la carpeta Repeat ahora vacía, y moví tmp \ Repeat nuevamente a la carpeta actual. ¡Una y otra vez!
ChkSystem simplemente ejecuta una llamada system () y verifica el valor de retorno, deteniéndose si falla.
Es importante destacar que falló varias veces. Pensé que quizás mi programa no estaba funcionando, o que era infinitamente largo después de todo. Sin embargo, he tenido esto antes con llamadas al sistema, con cosas que no se sincronizan, así que simplemente ejecuté el programa nuevamente y continuó desde donde se quedó, así que no piense inmediatamente que su programa no está funcionando. Entonces, en total, después de ejecutarlo unas 20 veces, los eliminó a todos. En total, tenía unas 1280 carpetas de profundidad originalmente. No tengo idea de qué lo causó. Loca.
fuente