16. januar 2000 - 21:25Der er
6 kommentarer og 1 løsning
Sletning af en fyldt folder...
Jeg har et problem med at slette en folder, hvori der er nogle file. Er der nogen som har et forslag ? Efter som at removedirectory() jo kun virker med en tømt folder...
Jeg har lige bikset den lidt sammen, så jeg kan ikke garantere for slåfejl også videre, men jeg vil da stærkt tro at den virker ellers så sig lige til, så skal jeg nok få den til at virke i morgen, nu vil jeg til og i seng, godnat :)
-------------------------- Uses FileCTRL;
Procedure DelDir(dir:string); var SearchRec: TSearchRec; begin If Copy(dir,Length(dir),1)<>'\' then dir:=dir+'\'; IF not DirectoryExists(dir) then begin showmessage('Directory "'+dir+'" does not exist!'); exit; end; If FindFirst(dir+'*.*', faAnyFile, SearchRec)=0 Then Repeat If SearchRec.Attr=faDirectory Then begin If (SearchRec.Name='.')or(SearchRec.Name='..') then Continue; //Delete subfolders DelDir(dir+SearchRec.Name); end else begin DeleteFile(dir+SearchRec.Name); end; until FindNext(SearchRec) <> 0; FindClose(SearchRec); end;
Som s skriver skal du først tømme directoriet og det gør du via en lykke. Når det er tømt sletter du selve directoriet:
function slet_dir(dir : string) : boolean; var Srec : TSearchrec; dummy : integer; sdir : string; begin result := false; sdir := trim(dir); if sdir = '' then exit; // sæt evt. result true hvis dir ikke findes if directoryexists(dir) then begin if sdir[length(sdir)] <> '\' then sdir := sdir + '\'; // sørg for at der er en backslash som afslutning dummy := FindFirst(sdir+'*.*,faAnyfile, SRec); while dummy = 0 do begin if srec.attr <> fadirectory then begin deletefile(srec.filename); end; dummy := FindNext(SRec); end; findclose(SRec); end; // alle filer slettet, fjern dir removedir(dir); result := directoryexists(dir); // blev det nu også slettet ? end;
Du skal dog huske at have unit FileCtrl med i din uses clause for at kunne bruge directory funktionerne.
DJ: Du glemte at fjerne biblioteket til sidst i din rutine (med RemoveDir). Ellers et klassisk eksempel på en fin lille rekursiv rutine, lige efter S's opskrift.
SJensen> Du mangler et check på filer der er direktories og som har navnet '.' eller '..'. Disse 'filer' skal springes over, når man roder med Dos filstrukture (og dets efterkommere), idet de ikke kan slettes/renames/etc. Desuden, så fejler din rutine, hvis der er underbiblioteker i det pågældende bibliotek. Til allersidst: Du bør flytte dit kald af RemoveDir indenfor begin-end blokken (en linie op) Som den står, vil et kald til rutinen med et ikke eksisterende dir-navn som parameter, resulterer i et forsøg på at slette pågældende bibliotek.
delphi>> ja .. jeg ved det godt, men det var sent var lidt sent i går og jeg var lidt træt :-) Men jeg har snakket med Terabyte om det, og han har vist nok også fået det til at virke .. så hvis han nu bare ville få lukket det spørgsmål :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.