Explicación técnica
La razón por la que la mayoría de los métodos están causando problemas es que Windows intenta enumerar los archivos y carpetas. Este no es un gran problema con unos pocos cientos, o incluso miles, de archivos / carpetas a unos pocos niveles de profundidad, pero cuando trillones de archivos en millones de carpetas que van a docenas de niveles de profundidad, entonces eso definitivamente atascará el sistema.
Deje que tenga "solo" 100,000,000 archivos, y Windows usa una estructura simple como esta para almacenar cada archivo junto con su ruta (de esa manera usted evita almacenar cada directorio por separado, ahorrando algo de sobrecarga):
struct FILELIST { // Total size is 264 to 528 bytes:
TCHAR name[MAX_PATH]; // MAX_PATH=260; TCHAR=1 or 2 bytes
FILELIST* nextfile; // Pointers are 4 bytes for 32-bit and 8 for 64-bit
}
Dependiendo de si usa caracteres de 8 bits o caracteres Unicode (usa Unicode) y si su sistema es de 32 bits o de 64 bits, entonces necesitará entre 25 GB y 49 GB de memoria para almacenar la lista (y esto es muy estructura simplificada).
La razón por qué Windows intenta enumerar los archivos y carpetas antes de eliminarlos, según el método que esté utilizando para eliminarlos, pero tanto el Explorador como el intérprete de comandos lo hacen (puede ver una demora cuando inicia el comando). También puede ver el flash de actividad del disco (HDD LED) cuando lee el árbol de directorios de la unidad.
Solución
Su mejor opción para lidiar con este tipo de situación es utilizar una herramienta de eliminación que elimine los archivos y carpetas individualmente, uno a la vez. No sé si hay herramientas preparadas para hacerlo, pero debería Ser posible lograr con un simple archivo por lotes.
@echo off
if not [%1]==[] cd /d %1
del /q *
for /d %%i in (*) do call %0 "%%i"
Lo que esto hace es comprobar si se pasó un argumento. Si es así, entonces cambia al directorio especificado (puede ejecutarlo sin un argumento para comenzar en el directorio actual o especificar un directorio, incluso en una unidad diferente para que comience allí).
A continuación, borra todos los archivos en el directorio actual. En este modo, no debe enumerar nada y simplemente eliminar los archivos sin absorber mucha memoria, si es que la hay.
Luego enumera las carpetas en el directorio actual y se llama a sí mismo, pasándole cada carpeta (auto) para que se retire hacia abajo.
Análisis
La razón por la que esto debería el trabajo es porque no enumera todos los archivos y carpetas en el árbol entero . No enumera ningún archivo, y solo enumera las carpetas en el directorio actual (más el restante unos en los directorios padre). Suponiendo que solo hay unos pocos cientos de subdirectorios en una carpeta determinada, esto no debería ser tan malo y, por supuesto, requiere mucha menos memoria que otros métodos que enumeran todo el árbol.
Usted puede preguntarse sobre el uso de la /r
cambiar en lugar de usar (manual) la recursión. Eso no funcionaría porque mientras el /r
switch hace recursión, pre-enumera todo el árbol de directorios, que es exactamente lo que queremos evitar; Queremos eliminar a medida que avanzamos sin seguir la pista.
Comparación
Permite comparar este método con los métodos de enumeración completa.
Habías dicho que tenías "millones de directorios"; Digamos 100 millones. Si el árbol está aproximadamente equilibrado, y suponiendo un promedio de aproximadamente 100 subdirectorios por carpeta, entonces el directorio anidado más profundo estaría alrededor de cuatro niveles por debajo: en realidad, habría 101,010,100 subcarpetas en todo el árbol. (Divertido cómo 100M puede descomponerse a solo 100 y 4).
Dado que no estamos enumerando archivos, solo debemos mantener un registro de como máximo 100 nombres de directorio por nivel, por un máximo de 4 × 100 = 400
directorios en un momento dado.
Por lo tanto, el requisito de memoria debe ser ~ 206.25KB, dentro de los límites de cualquier sistema moderno (o de otro tipo).
Prueba
Desafortunadamente (?) No tengo un sistema con billones de archivos en millones de carpetas, por lo que no puedo probarlo (creo que en el último recuento, tenía aproximadamente ~ 800K archivos), por lo que alguien más tendrá que intentarlo. eso.
Advertencia
Por supuesto, la memoria no es la única limitación. La unidad también será un gran cuello de botella porque, por cada archivo y carpeta que elimine, el sistema debe marcarlo como libre. Afortunadamente, muchas de estas operaciones de disco se agruparán (almacenarán en caché) y se escribirán en trozos en lugar de individualmente (al menos para discos duros, no para medios extraíbles), pero aún así causará un poco de palizas a medida que el sistema lea y escribe los datos.