Programowanie w języku Delphi » Gotowce

Usuwanie plików z progressem

  • 3 komentarze
  • 1008 odsłon
  • Oceń ten tekst jako pierwszy
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 komentarze

Mammoth 2009-09-15 11:39

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ą?

roodeo 2009-01-30 00:07

nic nie rozumiem :(

Wolverine 2005-11-28 18:27

<quote>Oczekuję komentarzy (to mój pierwszy artykuł/gotowiec) i pomysłów, jak napisać taką procedurę nie wykorzystując TSearchRec dwukrotnie. :)</quote>
Zapisz nazy plikow do tablicy.