Delete all files and folders recursively using Delphi

前端 未结 2 637
清酒与你
清酒与你 2020-12-09 18:44

I am trying to delete a folder and all of its sub-folders recursively but it is not working at all, so can someone please check the code and tell me what I am doing wrong he

相关标签:
2条回答
  • 2020-12-09 19:27

    Rather than do all this hard work yourself, I'd just use SHFileOperation:

    uses
      ShellAPI;
    
    procedure DeleteDirectory(const DirName: string);
    var
      FileOp: TSHFileOpStruct;
    begin
      FillChar(FileOp, SizeOf(FileOp), 0);
      FileOp.wFunc := FO_DELETE;
      FileOp.pFrom := PChar(DirName+#0);//double zero-terminated
      FileOp.fFlags := FOF_SILENT or FOF_NOERRORUI or FOF_NOCONFIRMATION;
      SHFileOperation(FileOp);
    end;
    

    For what it is worth, the problem with your code is that it doesn't ever call DeleteFile. And so the directories are never getting emptied, the calls to RemoveDir fail and so on. The lack of error checking in your code doesn't really help, but adding code to delete files would get that code in half-decent shape. You also need to take care with the recursion. You must make sure that all the children are deleted first, and then the parent container. That takes a certain degree of skill to get right. The basic approach is like this:

    procedure DeleteDirectory(const Name: string);
    var
      F: TSearchRec;
    begin
      if FindFirst(Name + '\*', faAnyFile, F) = 0 then begin
        try
          repeat
            if (F.Attr and faDirectory <> 0) then begin
              if (F.Name <> '.') and (F.Name <> '..') then begin
                DeleteDirectory(Name + '\' + F.Name);
              end;
            end else begin
              DeleteFile(Name + '\' + F.Name);
            end;
          until FindNext(F) <> 0;
        finally
          FindClose(F);
        end;
        RemoveDir(Name);
      end;
    end;
    

    I've omitted error checking for the sake of clarity, but you should check the return values of DeleteFile and RemoveDir.

    0 讨论(0)
  • 2020-12-09 19:41
    procedure DeleteDir(const DirName: string);
    var
      Path: string;
      F: TSearchRec;
    
    begin
      Path:= DirName + '\*.*';
      if FindFirst(Path, faAnyFile, F) = 0 then begin
        try
          repeat
            if (F.Attr and faDirectory <> 0) then begin
              if (F.Name <> '.') and (F.Name <> '..') then begin
                DeleteDir(DirName + '\' + F.Name);
              end;
            end
            else
              DeleteFile(DirName + '\' + F.Name);
          until FindNext(F) <> 0;
        finally
          FindClose(F);
        end;
      end;
      RemoveDir(DirName);
    end;
    
    0 讨论(0)
提交回复
热议问题