如何删除有文件和子目录的目录?

解决方案 »

  1.   

    unit DeleTree; interface 
    uses Classes, FileCtrl, SysUtils; procedure RemoveTree(path: string); 
    procedure RemoveDirectory(path: string); 
    procedure GetFileList(FileSpec: string;
                           NamesOnly: Boolean;
                           var FileList: TStringList); 
    procedure GetSubDirList(DirRoot: string;
                           NamesOnly: Boolean;
                           var SubDirList: TStringList); 
    function BackSlash(FileSpec: string): string; 
    function NoBackSlash(FileSpec: string): string; implementation {--------------------------------------------------------} 
    {这个过程删除整个目录树} 
    procedure RemoveTree(path: string); 
    var
      SubDirList: TStringList;
      FileList: TStringList;
      i: integer; 
    begin
      SubDirList := TStringList.Create;
      GetSubDirList(path,False,SubDirList);
      {如果这个树含有子目录,递归调用删除每一个子目录树}
      if SubDirList.Count>0 then
      begin
        for i := 0 to SubDirList.Count-1 do
        begin
          RemoveTree(SubDirList[i]);
        end;
      end;
      SubDirList.free;
      {到这一步所有的子目录树都已被删除,或者根本不存在。因而你们仅需要删除所有的文件}
      FileList := TStringList.Create;
      GetFileList(BackSlash(path)+'*.*',False,FileList);
      for i := 0 to FileList.Count-1 do
      begin
        DeleteFile(PChar(FileList[i]));
      end;
      FileList.Free;
      RemoveDirectory(path); 
    end; 
    {--------------------------------------------------------} 
    {这个过程将删除目录(如果它存在)} 
    procedure RemoveDirectory(path: string); 
    var
      Dir: string; 
    begin
      {删除反斜线(如果它存在)}
      Dir := NoBackSlash(path);
      if DirectoryExists(Dir) then RmDir(Dir); 
    end; {--------------------------------------------------------} 
    {这个过程把所有匹配文件规格的文件名加入一个StringList。如果NamesOnly是true,那么不包含文件路径} 
    procedure GetFileList(FileSpec: string;
                          NamesOnly: Boolean;
                          var FileList: TStringList); 
    var
      SR: TSearchRec;
      DosError: integer; 
    begin
      FileList.Clear;
      DosError := FindFirst(FileSpec, faAnyFile-faDirectory, SR);
      while DosError=0 do
      begin
        if NamesOnly
          then FileList.Add(SR.Name)
          else FileList.Add(ExtractFilePath(FileSpec)+SR.Name);
        DosError := FindNext(SR);
      end; 
    end; {--------------------------------------------------------} 
    {这个过程将指定的目录的全部下级目录名加入StringList。如果NamesOnly是true,那么仅仅包括最下级目录名} 
    procedure GetSubDirList(DirRoot: string;
                            NamesOnly: Boolean;
                            var SubDirList: TStringList); 
    var
      SR: TSearchRec;
      DosError: integer;
      Root: string; 
    begin
      SubDirList.Clear;
      {在最后加入一个反斜杠(如果不存在)}
      Root := BackSlash(DirRoot);
      {使用FindFirst/FindNext返回下级目录}
      DosError := FindFirst(Root+'*.*', faDirectory, SR);
      while DosError=0 do
      begin
        {don't include the directories . and ..}
        if pos('.',SR.Name)<>1 then
        begin
          if SR.Attr=faDirectory then
          begin
            if NamesOnly
              then SubDirList.Add(SR.Name)
              else SubDirList.Add(Root+SR.Name);
          end;
        end;
        DosError := FindNext(SR);
      end; 
    end; {--------------------------------------------------------} 
    {添加一个反斜杠(如果它不存在)} 
    function BackSlash(FileSpec: string): string; 
    begin
      if (FileSpec[length(FileSpec)]<>'\')
         then Result := FileSpec+'\'
         else Result := FileSpec; 
    end; {删除一个反斜杠(如果它存在)} 
    function NoBackSlash(FileSpec: string): string; 
    begin
      if (FileSpec[length(FileSpec)]='\')
         then Result := Copy(FileSpec,1,length(FileSpec)-1)
         else Result := FileSpec; 
    end; 
      

  2.   

    抄来一个办法,先uses shellapi;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      T:TSHFileOpStruct;
      P:String;
    begin
      P:='e:\te';
      With T do Begin
        Wnd:=0;
        wFunc:=FO_DELETE;
        pFrom:=Pchar(P);
        pTo:=nil;
        fFlags:=FOF_ALLOWUNDO+FOF_NOCONFIRMATION+FOF_NOERRORUI
        hNameMappings:=nil;
        lpszProgressTitle:='正在删除文件夹';
        fAnyOperationsAborted:=False;
      End;
      SHFileOperation(T);
    end;
      

  3.   

    同意 netwolfds(晓竹) 学习!
      

  4.   

    var
      OpStruc:TSHFileOpStruct;
      FromBuf:Array[0..128] of Char;
    begin
      FillChar(FromBuf,Sizeof(FromBuf),0);
      StrPCopy(FromBuf,Pchar(Edit1.Text));
      //开始填充OpStruc记录
      with OpStruc do
      begin
        Wnd:=Handle;
        wFunc:=FO_DELETE;
        pFrom:=@FromBuf;
        pTo:=nil;
        fFlags:=FOF_NOCONFIRMATION;
        lpszProgressTitle:='正在删除';
      end;
      if SHFileOperation(OpStruc)=0 then
      //执行成功
      MessageBox(Handle,'删除完毕。','删除信息',MB_OK+MB_ICONINFORMATION);
    end;