[Delphi] Usuwanie folderu razem z zawartością?

0

Szukalem w faq i artukulach ale znalazlem tylko RmDir('Folder'); ale to usuwa tylko foldery bez zawartosci

mnie natomiast interesuje jakas procedura usuwająca folder razem z jego zawartością (najleopiej jesli usuwala by tez folder w ktorym jest jeszcze inny folder)

z gory dzieki (poprawiliscie sie chlopaki bo dostaje coraz wiecej odpowiedzi na swoje pytania :) )

0

Gdzieś na 4p lezy sobie artykuł/gotowiec (nie wiem, czy nie w dziale algorytmy) o tworzeniu drzewa katalogów. Robisz to samo, tylko dodatkowo usuwasz wszystko.

0

Pobaw się z FindFirst, FindNext i FindClose
Zobacz też w F1

0

Albo prościej - skorzystaj z dosowego rmdir

0

rmDir('folder') usuwa tylko katalogi bez zawartosci - niestety - chyba ze dosową wersje sie jakos inaczej wywoluje

0
function DeleteDirectory( const dir, path : String) : Boolean; 
var 
SR : TSearchRec; 
Found : Integer; 
source : String; 
begin 
source := dir + path; 
Found := FindFirst( source+'\*.*', faAnyFile, SR ); 
try 
while (Found = 0) do 
begin 
if (SR.Name<>'.') and (SR.Name <> '..') then 
begin 
if (SR.Attr and faDirectory) <> 0 then 
begin 
DeleteDirectory( dir, path+'\'+SR.Name ); 
end 
else 
begin 
FileSetAttr( 
source+'\'+SR.Name, FileGetAttr(source+'\'+SR.Name) 
and 
not (faReadOnly or faHidden) ); 
if not DeleteFile( source+'\'+SR.Name ) then 
Result := False; 
end; 
end; 
Found := FindNext( SR ); 
end; 
finally 
FindClose(SR); 
end; 
RemoveDir( source ); 
end; 

wykorzystanie funkcji: DeleteDirectory('C:','Windows\Pulpit\a');

0

dzieki za kod bardzo sie przydal :) @~~

0

heh znowu mam problema co czeba zrobic zeby funkcja dzialala wtedy jak podam zmienne a nie stale???

chodzi mi o to zebym mogl tak to zrobic DeleteDirectory(zmienna1, zmienna2);
a nie DeleteDirectory(stala1, stala2);

pomocy

0

a próbowałeś zmienić w paramatrach procedury const na var???? :|

0

zamiast function DeleteDirectory( const dir, path : string) : Boolean;daj function DeleteDirectory( dir, path : string) : Boolean; :|

0

chodzi mi o to zebym mogl tak to zrobic DeleteDirectory(zmienna1, zmienna2);
a nie DeleteDirectory(stala1, stala2);

To są parametry - a nie "zmienna czy stała" .. W tym zapisie oznacza, że ich wartość nie zmienia się podczas działania funkcji.

0

ale i tak w parametrach musze wpisac stalą bo jak podaje zmienna to nic sie nie dzieje tzn folder i pliki nie usuwają sie

aha zmiana const na var nic nie daje bo potem wyskakuje jakic bląd w funkji jesli go chcecie moge go podac

0

ale i tak w parametrach musze wpisac stalą bo jak podaje zmienna to nic sie nie dzieje tzn folder i pliki nie usuwają sie

W takim razie błąd jest w samej funkcji, bo takie przekazanie:

function(const s: string): Boolean; // przykładowo

to przekazywanie parametru przez stałą - tak sie nazywa, ale w parametrze podajesz dowolny ciąg znaków - obojętnie czy stała czy zmienna - to nie ma z tym nic wspólnego. Decyduje to tylko o "życiu" parametru w samej funkcji. Odsyłam do kursów..

0

a moze to pchar a nie string?
sprobuj: pchar(zmienna) zamiast normalnie: zmienna
mozliwe tez ze w zmiennej jest cos dopisywane... sprawdz poprzez debuger... jesli tak to daj wtedy trim(zmienna)

//Detox... niewykluczone ze tak ;)

0

a moze to pchar a nie string?

Hmm - nie rozumiem.. po co stosować tu wskaźnik na łańcuch ??

A co do problemu : polecam sprawdzenie czy aby na pewno ścieżka jest dobrze podawana, może występuje tam jakaś mała literówka (za dużo lub za mało znaków '' )... - często się to zdarza...

0

to może wrzucę tu swoją prockę (przy której przy testowaniu ze względu o zapomnieniu o takiej pierdołce jak ".." - straciłem połowę dysku :D)

procedure skasujFolder(dir:string);
var files:TSearchRec;
begin
 {$I-}
 if FindFirst(dir+'\*.*',39,files)=0 then repeat
  if (files.Attr and 16)=0 then begin
   FileSetAttr(dir+'\'+files.Name,32);
   DeleteFile(dir+'\'+files.Name);
  end;
 until FindNext(files)<>0;
 FindClose(files);
 if FindFirst(dir+'\*.*',55,files)=0 then repeat
  if (files.Attr and 16)<>0 then begin
   if (files.Name<>'.') and (files.Name<>'..') then begin
   skasujFolder(dir+'\'+files.Name);
   end;
  end;
 until FindNext(files)<>0;
 FindClose(files);
 RmDir(dir);
 IOResult;
 {$I+}
end;

i przykład użycia:

skasujFolder('c:\temp');
if DirectoryExists('c:\temp') then ShowMessage('nie skasowało sie cosik') else
 ShowMessage('folderu nima');

aha w procce nie używałem stałych takich jak faAnyFile tylko dodawałem sobie ich wartości, jak np liczba 39 i 55 w findFirst :)

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