Rekurencja

0

Witam Waść!
Mam pewne problemy z rekurencją, mianowicie przerobiłem kod źródłowy Adama Boducha tak aby usuwał pliki przy wyszukiwaniu. No i usuwa ale nie usuwa na końcu katalogów. Wpadłem na pomysł że po skończonej pętli będzie usuwać katalogi przez rmdir, bo przecież są już puste. Ale gdzie tam! Przy wyszukiwaniu pętla spisuje nazwy katalogów do listboxa. A ja na końcu chciałem tylko:

for i:=0 to listbox1.items.count do
rmdir(listbox1.items[i]);

teoretycznie powinno działać, bo poprzednia pętla wywaliła wszystkie pliki i spisała adresy do listboxa. I co? Wywala błąd, że katalog nie pusty! :-/ Dobra zamieszczam pełny kod, zastanówcie się nad tym:


{------------------------------------------
 ------------------ KOD ------------------
 ------------------------------------------}

procedure TForm1.SearchDir(StartPath: String);
var
SR: TSearchRec;
Found : Integer;

function IsDir(Value : String) : String;
begin
     if Value[Length(Value)] <> '' then
     Result := Value + '' else Result := Value;
end;

begin
     Found := FindFirst(IsDir(StartPath) + '*.*', faDirectory, SR);
     while Found = 0 do
     begin
          Application.ProcessMessages;
          if ((SR.Attr and faDirectory) = faDirectory) and
          ((SR.Name <> '.') and (SR.Name <> '..')) then
          begin
               ListBox1.Items.Add(IsDir(StartPath) + SR.Name);
               SearchDir(IsDir(StartPath) + SR.Name); {<-- w tym miejscu nastŕpuje wywo&#9474;anie
               samej siebie }
          end;
          deletefile(StartPath+''+Sr.Name);
          Found := FindNext(SR);
     end;
     FindClose(SR);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
     i: integer;

begin
     SearchDir('e:\ 1'); //bez spacji
     for i:=0 to listbox1.items.count do
     rmdir(listbox1.items[i]);
end;

Pozdrawiam Kamil :-)

0

Wydaje mi się, że powinieneś usuwać katalog po tej linijce:

  SearchDir(IsDir(StartPath) + SR.name);
  RmDir(IsDir(Startpath) + SR.name);

Czyli po tym jak już wyszuka i usunie wszystko z niego.

0

A czy nie jest to zbyt chaotyczne? To znaczy przykład:

katalog1
+katalog2
|+katalog3
+katalog4
+katalog5

I teraz kolejno: zapisuje katalog1 w pierwszej linijce ListBox'a, potem katalog2 w drugiej, katalog3 w trzeciej, katalog4 w czwartej, katalog5 w piatej i potem chce kasowac: katalog1 BUM! I wywala ci błąd, bo w katalog1 są jeszcze dwa katalogi. Sugeruję kasować od końca...

0

moja wersja:

{...}
      FindFirst(IsDir(StartPath) + '*.*', faDirectory, SR); 
     repeat
        Application.ProcessMessages;
        if ((SR.Attr and faDirectory) = faDirectory) and
           ((SR.name <> '.') and (SR.name <> '..')) then
         begin
            SearchDir(IsDir(StartPath) + SR.name);
            rmdir(IsDir(StartPath) + SR.name);
         end else
         if ((SR.Attr and faDirectory) = 0) then deletefile(StartPath+''+Sr.name);
      until not FindNext(SR);
      FindClose(SR);
{...}

(uwaga, pisane bez kompilacji)

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