Opi napisał(a)
Poza tym, sprawdzanie rozmiaru każdego pliku, bardzo spowolni proces szukania.
bzdura, nie spowoli ani trochę, przecież rozmiar pliku znajduje się w deskryptorze pliku, czyli we wpisie w katalogu odczytywanym podczas listowania jego zawartości.
DiskSize()-DiskFree() może się zmieniać w trakcie przetwarzania danych - bo nie tylko twój proces może w tym czasie korzystać z dysku. do tego dla pustego dysku DiskSize() != DiskFree(), bo dysk zawiera tablicę MFT/FAT (kilka procent pojemności dysku!), dysk z danymi zawiera też katalogi - myślisz, że katalog nie ma rozmiaru? co z tego, że nie ma pojemności, kiedy przecież gdzieś na dysku musi być zapisana jego nazwa, daty, uprawnienia, i przede wszystkim jego zawartość - pliki i podkatalogi... Zapomniałes też, że każdy plik na dysku ma rozmiar modulo rozmiar klastra (typowo 4-8kB), więc bardzo rzadko plik zajmuje dokładnie tyle samo miejsca na dysku, ile ma rozmiaru. I ostatnia sprawa - na partycjach NTFS część plików jest skompresowana, więc z kolei zajmuje na dysku mniej, niż ma fizycznie rozmiaru...
Tak więc dla całkowicie zapełnionego dysku całkowity rozmiar plików to jakieś 90-95% pojemności dysku, im więcej pustego miejsca tym bardziej stosunek sumy rozmiaru wszystkich plików do zajętego miejsca na dysku zbliża się do zera. stąd twoje 12%, a nie tak jak napisał Opi.
Wniosek końcowy: DiskSize()-DiskFree() może być używany co najwyżej do bardzo zgrubnego oszacowania miejsca zajmowanego przez pliki. W twoim przypadku nie powinien być używany wcale.