Teknik Açıklama
Çoğu yöntemin sorunlara neden olmasının nedeni, Windows'un dosya ve klasörleri numaralandırmaya çalışmasıdır. Bu, birkaç yüz derinlikteki birkaç yüz veya hatta bin dosya / klasörle ilgili bir sorun değildir, ancak milyonlarca klasörde düzinelerce seviyeye inen trilyonlarca dosyaya sahip olduğunuzda, bu kesinlikle sistemi bozacaktır .
"Yalnızca" 100.000.000 dosyanız var ve Windows, her dosyayı yoluyla birlikte depolamak için böyle basit bir yapı kullanıyor (bu şekilde her dizini ayrı ayrı depolamaktan kaçınıyorsunuz, böylece bir miktar ek yük kaydediyorsunuz):
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
}
8-bit karakterler mi yoksa Unicode karakterler mi (Unicode kullanıyor) ve sisteminizin 32 bit mi yoksa 64 bit mi olduğuna bağlı olarak, listeyi saklamak için 25 GB ile 49 GB arasında bellek gerekir (ve bu çok çok basitleştirilmiş yapı).
Sebebi neden , Windows onları silmeden önce dosya ve klasörleri numaralandırmaya çalışır Bunları silmek için kullandığınız yönteme bağlı olarak değişir, ancak her iki Explorer ve komut yorumlayıcı (komutunu başlatırken bir gecikme görebilir) bunu. Disk etkinliğini (HDD LED'i), dizin ağacını sürücüden okurken de görebilirsiniz.
Çözüm
Bu tür bir durumla başa çıkmanın en iyi yolu, dosyaları ve klasörleri teker teker silen bir silme aracı kullanmaktır. Bunu yapmak için hazır herhangi bir araç olup olmadığını bilmiyorum, ancak basit bir toplu iş dosyasıyla başarmak mümkün olmalıdır .
@echo off
if not [%1]==[] cd /d %1
del /q *
for /d %%i in (*) do call %0 "%%i"
Bunun yaptığı bir argümanın iletilip iletilmediğini kontrol etmektir. Öyleyse, belirtilen dizine dönüşür (geçerli dizinde başlamak için bağımsız değişken olmadan çalıştırabilir veya orada başlamak için farklı bir sürücüde bile bir dizin belirtebilirsiniz).
Ardından, geçerli dizindeki tüm dosyaları siler. Bu modda, hiçbir şey numaralandırmamalı ve çok fazla bellek tüketmeden dosyaları silmemelidir.
Daha sonra geçerli dizindeki klasörleri numaralandırır ve kendisini çağırır, her klasörü aşağı doğru geri almak için kendisine (kendinden) geçirir.
analiz
Bu nedeni olmalı bunun içinde her bir dosya ve klasörü numaralandırmaz için işe olan tüm ağacı . Hiçbir dosyayı numaralandırmaz ve yalnızca geçerli dizindeki klasörleri (ayrıca üst dizinlerde kalan klasörleri) numaralandırır . Herhangi bir klasörde sadece birkaç yüz alt dizin olduğunu varsayarsak, bu çok kötü olmamalıdır ve kesinlikle tüm ağacı numaralandıran diğer yöntemlerden çok daha az bellek gerektirir.
/r
(Manuel) özyineleme kullanmak yerine anahtarı kullanmayı merak edebilirsiniz . Bu işe yaramaz çünkü /r
anahtar özyineleme yaparken , tam olarak kaçınmak istediğimiz şey olan dizin ağacını önceden numaralandırır; takip etmeden giderken silmek istiyoruz.
karşılaştırma
Bu yöntemi tam numaralandırma yöntem (ler) i ile karşılaştıralım.
“Milyonlarca dizininiz” olduğunu söylemiştiniz; diyelim 100 milyon. Ağaç yaklaşık olarak dengeliyse ve klasör başına ortalama yaklaşık 100 alt dizin varsayarsa, en derin iç içe dizin yaklaşık dört düzey aşağı olur - aslında, tüm ağaçta 101,010,100 alt klasör olur. (100M'in sadece 100 ve 4'e nasıl ayrılabileceğini eğlendirmek.)
Dosyaları numaralandırmadığımız için, 4 × 100 = 400
belirli bir zamanda en fazla dizin için seviye başına yalnızca en fazla 100 dizin adını izlememiz gerekir .
Bu nedenle, bellek gereksinimi ~ 206.25KB, herhangi bir modern (veya başka) sistem sınırları dahilinde olmalıdır.
Ölçek
Ne yazık ki (?) Milyonlarca klasörde trilyonlarca dosyaya sahip bir sistemim yok, bu yüzden test edemiyorum (son sayımda inanıyorum, yaklaşık ~ 800K dosyam vardı), bu yüzden başka biri denemek zorunda kalacak o.
Uyarı
Elbette bellek tek sınırlama değildir. Sildiğiniz her dosya ve klasör için sistemin boş olarak işaretlemesi gerektiğinden sürücü de büyük bir darboğaz olacaktır. Neyse ki, bu disk işlemlerinin birçoğu birlikte paketlenecek (önbelleğe alınacak) ve ayrı ayrı yerine parçalar halinde yazılacak (en azından sabit diskler için, çıkarılabilir medya için değil), ancak sistem okurken yine de biraz dayalanmaya neden olacak ve verileri yazar.