Explication technique
La raison pour laquelle la plupart des méthodes posent problème est que Windows essaie d'énumérer les fichiers et les dossiers. Ce n'est pas vraiment un problème avec quelques centaines - ou même mille - fichiers / dossiers à quelques niveaux de profondeur, mais lorsque vous avez des milliards de fichiers dans des millions de dossiers à des dizaines de niveaux, cela va définitivement gâcher le système. .
Laissez-nous avoir «seulement» 100 000 000 de fichiers, et Windows utilise une structure simple comme celle-ci pour stocker chaque fichier avec son chemin (de cette façon, vous évitez de stocker chaque répertoire séparément, économisant ainsi une surcharge):
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
}
Selon qu'il utilise des caractères 8 bits ou des caractères Unicode (il utilise Unicode) et si votre système est 32 bits ou 64 bits, alors il aura besoin entre 25 Go et 49 Go de mémoire pour stocker la liste (et c'est un très structure simplifiée).
La raison pour laquelle Windows essaie d'énumérer les fichiers et les dossiers avant de les supprimer varie selon la méthode que vous utilisez pour les supprimer, mais l'Explorateur et l'interpréteur de commandes le font (vous pouvez voir un délai lorsque vous lancez la commande). Vous pouvez également voir l'activité du disque (LED HDD) clignoter lors de la lecture de l'arborescence de répertoires du lecteur.
Solution
Votre meilleur pari pour faire face à ce genre de situation est d'utiliser un outil de suppression qui supprime les fichiers et les dossiers individuellement, un par un. Je ne sais pas s'il existe des outils prêts à l'emploi pour le faire, mais il devrait être possible d'accomplir avec un simple fichier de commandes.
@echo off
if not [%1]==[] cd /d %1
del /q *
for /d %%i in (*) do call %0 "%%i"
Cela permet de vérifier si un argument a été transmis. Si tel est le cas, il se transforme en répertoire spécifié (vous pouvez l'exécuter sans argument pour démarrer dans le répertoire en cours ou spécifier un répertoire - même sur un autre lecteur pour qu'il démarre là).
Ensuite, il supprime tous les fichiers du répertoire actuel. Dans ce mode, il ne doit rien énumérer et simplement supprimer les fichiers sans aspirer beaucoup de mémoire, le cas échéant.
Ensuite, il énumère les dossiers dans le répertoire en cours et s'appelle lui-même, en lui passant chaque dossier (auto) pour reculer vers le bas.
Une analyse
La raison pour laquelle cela devrait fonctionner est qu'elle n'énumère pas tous les fichiers et dossiers de l' arborescence entière . Il n'énumère aucun fichier et énumère uniquement les dossiers du répertoire actuel (plus les autres dans les répertoires parents). En supposant qu'il n'y a que quelques centaines de sous-répertoires dans un dossier donné, cela ne devrait pas être trop mauvais et nécessite certainement beaucoup moins de mémoire que les autres méthodes qui énumèrent l'arborescence entière.
Vous pouvez vous demander d'utiliser le /r
commutateur au lieu d'utiliser la récursion (manuelle). Cela ne fonctionnerait pas car, bien que le /r
commutateur effectue une récursivité, il pré-énumère l'arborescence de répertoires entière, ce qui est exactement ce que nous voulons éviter; nous voulons supprimer au fur et à mesure sans suivre.
Comparaison
Permet de comparer cette méthode aux méthodes de dénombrement complet.
Vous aviez dit que vous aviez «des millions d'annuaires»; disons 100 millions. Si l'arborescence est approximativement équilibrée et en supposant une moyenne d'environ 100 sous-répertoires par dossier, alors le répertoire imbriqué le plus profond serait d'environ quatre niveaux plus bas - en fait, il y aurait 101 010 100 sous-dossiers dans toute l'arborescence. (Amusant de voir comment 100M peut se réduire à 100 et 4.)
Étant donné que nous n'énumérons pas les fichiers, nous devons seulement garder une trace d'au plus 100 noms de répertoire par niveau, pour un maximum de 4 × 100 = 400
répertoires à un moment donné.
Par conséquent, la mémoire requise devrait être de ~ 206,25 Ko, bien dans les limites de tout système moderne (ou autre).
Tester
Malheureusement (?) Je n'ai pas de système avec des milliards de fichiers dans des millions de dossiers, donc je ne suis pas en mesure de le tester (je crois qu'au dernier décompte, j'avais environ ~ 800 Ko de fichiers), donc quelqu'un d'autre devra essayer il.
Caveat
Bien sûr, la mémoire n'est pas la seule limitation. Le lecteur sera également un gros goulot d'étranglement car pour chaque fichier et dossier que vous supprimez, le système doit le marquer comme libre. Heureusement, bon nombre de ces opérations sur disque seront regroupées (mises en cache) et écrites en morceaux plutôt qu'individuellement (au moins pour les disques durs, pas pour les supports amovibles), mais cela provoquera toujours un peu de thrashing pendant la lecture du système. et écrit les données.