Usuwanie plików z progressem

konik

Miałem problem z napisaniem procedurki, która by usuwała wszystkie pliki w danym folderze, pokazując postęp na progressbarze. Poprosiłem o pomoc na forum i dostałem satysfakcjonujące odpowiedzi ;). Poradziłem sobie z tym, napisałem procedurkę i teraz chcę się nią podzielić ;) (szukałem tego tematu w różnych działach na stronie - nie było - więc stwierdziłem, że nie zaszkodzi, jak napiszę taki gotowiec).
Na formie będą się znajdowały: Progress bar i label.

Oto procedura:


procedure usunPliki(sciezka : string);
var
   rec : TSearchRec; { deklarujemy potrzebne zmienne - TSearchRec to klasa potrzebna do wyszukiwania plików (artykuł w artykułach :))}
   
   found, i : integer; // found - zmienna pomocnicza, i - ilosc plików w danym folderze
begin
     i:=0; // przypisujemy 0 zmiennej i, aby zapobiec komplikacjom przy kilkukrotnym wywoływaniu procedury     

     
     {Przeszukujemy folder w celu ustalenia ilości znajdujących się tam plików}

     Found := FindFirst(sciezka+'*.*', faAnyFile, rec); // rozpoczynamy wyszukiwanie
     
     while found=0 do
     begin
     if (rec.Name<>'.') and (rec.Name<>'..') then i:=i+1; {jeśli to podfolder, pierwsze "pliki" mają jako nazwę kropkę lub dwie (patrz artykuły). Dlatego nie dodajemy tych nazw do zmiennej i}

     Found := FindNext(rec); // szukamy znowu
     end;

     form3.Show;
     form3.progress.Max:=i; // przypisujemy progressowi "i" (ilość plików) jako maxymalną liczbę     



     {Teraz będziemy przeszukiwać folder jeszcze raz, tym razem usuwając wszystkie pliki po kolei}

     Found := FindFirst(sciezka+'*.*', faAnyFile, rec);
     
     while found=0 do
     begin
     form3.lblName.Caption:='Usuwanie: '+sciezka+rec.Name; { label będzie miał np. caption: "Usuwanie: C:/Windows/Temp/Jakis_plik.txt" }
     deletefile(sciezka+rec.Name); { usuwamy plik którego nazwa jest zawarta w klasie TSearchRec (Patrz artykuły :P)}
     sleep(10); { to opcjonalnie - czekamy jakiś czas, żeby pasek progressa tak szybko nie "przelatywał" (dzieje się tak jak jest mało plików)}
     form3.progress.Now:=form3.progress.Now+1; // dodajemy progressowi postęp + 1(usunięty plik)
     application.ProcessMessages; //bez tego będzie się wydawało jakby aplikacja się "zawiesiła"
     Found := FindNext(rec); // wyszukujemy kolejny plik
     end;

     Form3.lblName.Caption:='Usunięto!'; { na końcu label ma tekścik "Usunięto!" informujący o tym, że operacja usuwania plików się odbyłą bezproblemowo}
     
end;

Oczywiście można dodać obsługę błędów, usuwanie katalogów itd.
Oczekuję komentarzy (to mój pierwszy artykuł/gotowiec) i pomysłów, jak napisać taką procedurę nie wykorzystując TSearchRec dwukrotnie. :)

3 komentarzy

application.ProcessMessages; zdejmuje wszystkie komunikaty z kolejki tzn, że ruszając myszką, klikając itp wpływamy na szybkość wykonywanej operacji.

Windows jest przecież systemem wielowątkowym to dlaczego by nie skorzystać z opcji tworzenia nowego wątku (czyszczącego pliki) który działał by równolegle z aplikacją?

nic nie rozumiem :(

Oczekuję komentarzy (to mój pierwszy artykuł/gotowiec) i pomysłów, jak napisać taką procedurę nie wykorzystując TSearchRec dwukrotnie. :)

Zapisz nazy plikow do tablicy.