Skanowanie a jego postęp

0

Witam
Napisałem aplikację skanującą dany dysk w poszukiwaniu określonych plików. Chciałem pokazać postęp tego skanowania. Wymyśliłem coś takiego:

//pętla szukająca
ilość_przeskanowanych_danych := ilość_przeskanowanych_danych+Rozmiar obecnie znalezionego pliku;
postęp := (ilość_przeskanowanych_danych*100)/(DiskSize(0)-DiskFree(0));

Teoretycznie powinienem dostać procentowy postęp skanowania a tu przy jego zakończeniu dostaję wynik w okolicach powiedzmy 12%. Co robię nie tak?

0

Problem jest w tym, że nie skanujesz całego dysku, a jeśli to robisz to bierzesz pod uwagę tylko pliki, które pasowały do wzorca Twojego filtra.

Poza tym, sprawdzanie rozmiaru każdego pliku, bardzo spowolni proces szukania.

0
Opi napisał(a)

Problem jest w tym, że nie skanujesz całego dysku, a jeśli to robisz to bierzesz pod uwagę tylko pliki, które pasowały do wzorca Twojego filtra.

Poza tym, sprawdzanie rozmiaru każdego pliku, bardzo spowolni proces szukania.

DiskSize(0)-DiskFree(0) daje nam ilość zajętej powierzchni partycji. Większość powierzchni partycji zajmują pliki (przynajmniej tak mi się wydaje). Skanuję całą partycję czyli wszystki pliki i sprawdzam czy obecnie skanowany plik pasuje do wzorca, którego szukam. Biorę pod uwagę wszystkie pliki przy sumowaniu wielkości już tych przeskanowanych.

0

Polecam ten temat moze okaze sie pomocny
Rozdział 8

1
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.

0

Pokombinowałem trochę i teraz jest ok. Chodzi tylko o oszacowanie procentowego postępu więc nie musi to być super dokładne. Dokładny pomiar byłby naprawdę skomplikowany z tego co pisze ŁF. Wielkie dzięki!

0

To sie mogło jeszcze brać z tego że wiele procedur pomija piliki systemowe czy ukryte które też zajmują miejsce i to wprowadza kolejne % błedy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1