Skanowanie a jego postęp

Skanowanie a jego postęp
MikiKam
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad 6 lat
  • Postów:75
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:

Kopiuj
//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?

Opi
  • Rejestracja:ponad 20 lat
  • Ostatnio:23 dni
  • Postów:1030
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.

MikiKam
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad 6 lat
  • Postów:75
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.

woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 15 godzin
  • Postów:1599
0

Polecam ten temat moze okaze sie pomocny
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_8

ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 18 godzin
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.


MikiKam
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad 6 lat
  • Postów:75
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!

AD
  • Rejestracja:ponad 18 lat
  • Ostatnio:6 miesięcy
  • Postów:206
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.