Technische Erklärung
Die meisten Methoden verursachen Probleme, weil Windows versucht, die Dateien und Ordner aufzulisten. Bei ein paar hundert oder sogar tausend Dateien / Ordnern mit einer Tiefe von einigen Ebenen ist dies kein großes Problem. Wenn Sie jedoch Billionen von Dateien in Millionen von Ordnern haben, die Dutzende von Ebenen tief gehen, wird dies das System definitiv zum Erliegen bringen .
Sie haben "nur" 100.000.000 Dateien, und Windows verwendet eine einfache Struktur wie diese, um jede Datei zusammen mit ihrem Pfad zu speichern.
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
}
Abhängig davon, ob 8-Bit-Zeichen oder Unicode-Zeichen (Unicode) verwendet werden und ob Ihr System 32-Bit- oder 64-Bit-Speicher ist, werden zwischen 25 GB und 49 GB Arbeitsspeicher zum Speichern der Liste benötigt (und dies ist sehr wichtig) vereinfachte Struktur).
Der Grund, warum Windows versucht, die Dateien und Ordner vor dem Löschen aufzulisten, hängt von der Methode ab, mit der Sie sie löschen. Dies geschieht jedoch sowohl im Explorer als auch im Befehlsinterpreter (es kann eine Verzögerung auftreten, wenn Sie den Befehl einleiten). Sie können auch sehen, wie die Festplattenaktivität (HDD-LED) blinkt, während der Verzeichnisbaum vom Laufwerk gelesen wird.
Lösung
In solchen Situationen sollten Sie am besten ein Löschtool verwenden, das die Dateien und Ordner einzeln nacheinander löscht. Ich weiß nicht, ob es dafür fertige Tools gibt, aber es sollte möglich sein, dies mit einer einfachen Batch-Datei zu erreichen.
@echo off
if not [%1]==[] cd /d %1
del /q *
for /d %%i in (*) do call %0 "%%i"
Dies überprüft, ob ein Argument übergeben wurde. In diesem Fall wechselt es in das angegebene Verzeichnis (Sie können es ohne Argument ausführen, um im aktuellen Verzeichnis zu starten, oder ein Verzeichnis angeben - auch auf einem anderen Laufwerk, damit es dort startet).
Als nächstes werden alle Dateien im aktuellen Verzeichnis gelöscht. In diesem Modus sollte es nichts aufzählen und die Dateien einfach löschen, ohne viel, wenn überhaupt, Speicherplatz in Anspruch zu nehmen.
Dann zählt es die Ordner im aktuellen Verzeichnis auf und ruft sich selbst auf, wobei es jeden Ordner an sich selbst weiterleitet, um abwärts zu rekursieren.
Analyse
Der Grund, warum dies funktionieren sollte , ist, dass nicht jede einzelne Datei und jeder einzelne Ordner in der gesamten Struktur aufgelistet wird . Es werden überhaupt keine Dateien aufgelistet und nur die Ordner im aktuellen Verzeichnis (sowie die übrigen in den übergeordneten Verzeichnissen). Angenommen, es gibt nur ein paar hundert Unterverzeichnisse in einem bestimmten Ordner, dann sollte dies nicht allzu schlimm sein und mit Sicherheit viel weniger Speicher als bei anderen Methoden, die den gesamten Baum auflisten.
Möglicherweise möchten Sie den /r
Schalter anstelle der (manuellen) Rekursion verwenden. Das würde nicht funktionieren, da der /r
Switch zwar eine Rekursion durchführt, aber den gesamten Verzeichnisbaum vorab auflistet, was genau das ist, was wir vermeiden wollen. Wir möchten löschen, ohne den Überblick zu behalten.
Vergleich
Vergleichen wir diese Methode mit der (den) Methode (n) mit vollständiger Aufzählung.
Sie hatten gesagt, Sie hätten "Millionen von Verzeichnissen"; Sagen wir 100 Millionen. Wenn der Baum ungefähr ausgeglichen ist und ein Durchschnitt von etwa 100 Unterverzeichnissen pro Ordner angenommen wird, wäre das tiefste verschachtelte Verzeichnis etwa vier Ebenen tiefer - tatsächlich gibt es 101.010.100 Unterverzeichnisse im gesamten Baum. (Amüsant, wie 100M auf nur 100 und 4 herunterbrechen können.)
Da wir keine Dateien auflisten, müssen wir nur maximal 100 Verzeichnisnamen pro Ebene für maximal 4 × 100 = 400
Verzeichnisse zu einem bestimmten Zeitpunkt nachverfolgen.
Aus diesem Grund sollte der Speicherbedarf ~ 206,25 KB betragen und innerhalb der Grenzen eines modernen (oder anderen) Systems liegen.
Prüfung
Leider (?) Habe ich kein System mit Billionen von Dateien in Millionen von Ordnern, daher kann ich es nicht testen (ich glaube, zuletzt hatte ich ungefähr 800.000 Dateien), also muss es jemand anderes versuchen es.
Vorbehalt
Natürlich ist der Speicher nicht die einzige Einschränkung. Das Laufwerk stellt auch einen großen Engpass dar, da das System für jede gelöschte Datei und jeden Ordner diese als frei markieren muss. Zum Glück werden viele dieser Festplattenvorgänge gebündelt (zwischengespeichert) und nicht einzeln, sondern in Blöcken geschrieben (zumindest für Festplatten, nicht für Wechselmedien), aber es wird immer noch einiges an Thrashing verursachen, während das System liest und schreibt die Daten.