windows - Delphi, slet mappe med indhold

Indlæg af Hanne Mølgaard Plasc

Problem



når jeg har undermappe i mappe - denne kode er ikke slettet mapper ... Er der nogen fejl?


procedure TForm.Remove(Dir: String);
var
  Result: TSearchRec; Found: Boolean;
begin
  Found := False;
  if FindFirst(Dir + '*', faAnyFile, Result) = 0 then
    while not Found do begin
      if (Result.Attr and faDirectory = faDirectory) AND (Result.Name <> '.') AND (Result.Name <> '..') then Remove(Dir + '' + Result.Name)
      else if (Result.Attr and faAnyFile <> faDirectory) then DeleteFile(Dir + '' + Result.Name);
      Found := FindNext(Result) <> 0;
    end;
  FindClose(Result); RemoveDir(Dir);
end;

Bedste reference


Hvis jeg var dig, vil jeg bare fortælle operativsystemet at slette mappen med hele sit indhold. Gør det ved at skrive (uses ShellAPI)


var
  ShOp: TSHFileOpStruct;
begin
  ShOp.Wnd := Self.Handle;
  ShOp.wFunc := FO\_DELETE;
  ShOp.pFrom := PChar('C:UsersAndreas RejbrandDesktopTest'#0);
  ShOp.pTo := nil;
  ShOp.fFlags := FOF\_NO\_UI;
  SHFileOperation(ShOp);


[[Hvis du gør


  ShOp.fFlags := 0;


I stedet får du en god bekræftelsesdialog. Hvis du gør


ShOp.fFlags := FOF\_NOCONFIRMATION;


Du får ikke bekræftelsesdialogen, men du får en fremdriftslinje, hvis operationen er lang. Endelig, hvis du tilføjer flag FOF\_ALLOWUNDO, flytter du biblioteket til Affaldsspanden i stedet for permanent at slette det.


ShOp.fFlags := FOF\_ALLOWUNDO;


Selvfølgelig kan du kombinere flag som du kan lide:


ShOp.fFlags := FOF\_NOCONFIRMATION or FOF\_ALLOWUNDO;


vil ikke vise nogen bekræftelse (men en fremdriftsdialog fordi du ikke angiver FOF\_NO\_UI) og mappen flyttes til papirkurven og ikke slettes permanent.]]

Andre referencer 1


Den enkleste ting at gøre er at ringe TDirectory.Delete(Dir, True). [21]


TDirectory findes i IOUtils, hvilket er en ganske ny RTL-tilføjelse. [22]


Flag True sendes til parameteren Recursive, hvilket betyder, at indholdet af katalogerne er tømt, før mappen fjernes, en væsentlig del af sletningen af ​​mapper.





I en kommentar fortæller vi os, at du bruger Delphi 7, og det kan derfor ikke bruges.


Din kode ser stort set fint ud. Men du mener ikke:


(Result.Attr and faAnyFile <> faDirectory)


Jeg mener du mener:


(Result.Attr and faDirectory <> faDirectory)


Jeg vil nok skrive det som følger:


procedure TMyForm.Remove(const Dir: string);
var
  Result: TSearchRec;
begin
  if FindFirst(Dir + '*', faAnyFile, Result) = 0 then
  begin
    Try
      repeat
        if (Result.Attr and faDirectory) = faDirectory then
        begin
          if (Result.Name <> '.') and (Result.Name <> '..') then
            Remove(Dir + '' + Result.Name)
        end
        else if not DeleteFile(Dir + '' + Result.Name) then
          RaiseLastOSError;
      until FindNext(Result) <> 0;
    Finally
      FindClose(Result);
    End;
  end;
  if not RemoveDir(Dir) then
    RaiseLastOSError;
end;

Andre referencer 2


Sidste gang jeg skulle slette en mappe med indhold, brugte jeg JCL: [23]


uses JclFileUtils;

DeleteDirectory(DirToDelete, True);


Den sidste parameter fortæller om filerne skal gå til papirkurven eller ej, hvilket er en god bonus.

Andre referencer 3


For at løse det oprindelige problem - prøv dette:


procedure TForm.Remove(const Dir: String);
var
  sDir: String;
  Rec: TSearchRec;
begin
  sDir := IncludeTrailingPathDelimiter(Dir);
  if FindFirst(sDir + '*.*', faAnyFile, Rec) = 0 then
  try
    repeat
      if (Rec.Attr and faDirectory) = faDirectory then
      begin
        if (Rec.Name <> '.') and (Rec.Name <> '..') then
          Remove(sDir + Rec.Name);
      end else
      begin
        DeleteFile(sDir + Rec.Name);
      end;
    until FindNext(Rec) <> 0;
  finally
    FindClose(Rec);
  end;
  RemoveDir(sDir);
end; 

Andre referencer 4


uses DSiWin32;

DSiDeleteTree(folderName, false);


DSiWin32 er open source-projektet udslettet med 'brug som du ønsker' licens. [24]