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. :)
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 :(
Zapisz nazy plikow do tablicy.