怎样用delphi实现删除一个指定目录下的所有文件和目录?要求: 用API函数.我用递归编了个算法,但怎么都删不了目录,只是把所有文件都删了而已!现在迷惘中,用惯C的我真的很难适应pascal,哪位高手给个具体点的算法我?谢谢!可能用到的API:
mainpath:PCHAR; //mainpath为指定目录
FindFirstFile(PCHAR, _WIN32_FIND_DATA):Cardinal;
FindNextFile(Cardinal, _WIN32_FIND_DATA);
DeleteFile(PCHAR);
RemoveDirectory(PCHAR);

解决方案 »

  1.   

    function TForm1.Deltree (path : string): Boolean ;   var    SearchRec: TSearchRec;   begin   //判断目录是否存在 if DirectoryExists(path) then begin   //进入该目录,删除其中的子目录和文件    oldDir := GetCurrentDir;    ChDir(path);   //查找目录中所有任何文件   FindFirst(′.′, faAnyFile, SearchRec);   repeat   //修改文件属性为普通属性值    FileSetAttr(SearchRec.Name,0);   //如果是目录并且不是.和..则递归调用DelTree   if(SearchRec.Attr and faDirectory > 0) then   begin   if(SearchRec.Name[1]<>′.′) then   if(not Deltree(SearchRec.Name)) then   break;   end   //如果是文件直接删除   else   if(not DeleteFile(SearchRec.Name))then   break ;   //继续查找,直到最后   until (FindNext(SearchRec)<>0) ;   //回到父目录,删除该目录   ChDir(′..′);   Result := ReMoveDir(path); SetCurrentDir(oldDir);   end   else   Result := False ;   end ; 
      

  2.   

    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; end.
      

  3.   

    我创建了个窗口,只有一个按钮,点击就删除,但也出现了同样的情况:
    只删除文件,不能删除目录,为什么?
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, FileCtrl, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        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;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }  public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.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 TForm1.RemoveDirectory(path: string);
    var
      Dir: string; 
    begin
      {删除反斜线(如果它存在)}
      Dir := NoBackSlash(path);
      if DirectoryExists(Dir) then RmDir(Dir); 
    end; {--------------------------------------------------------} 
    {这个过程把所有匹配文件规格的文件名加入一个StringList。如果NamesOnly是true,那么不包含文件路径} 
    procedure TForm1.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 TForm1.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 TForm1.BackSlash(FileSpec: string): string;
    begin
      if (FileSpec[length(FileSpec)]<>'\')
         then Result := FileSpec+'\'
         else Result := FileSpec; 
    end; {删除一个反斜杠(如果它存在)} 
    function TForm1.NoBackSlash(FileSpec: string): string; 
    begin
      if (FileSpec[length(FileSpec)]='\')
         then Result := Copy(FileSpec,1,length(FileSpec)-1)
         else Result := FileSpec; 
    end; 
    procedure TForm1.Button1Click(Sender: TObject);
    begin
         removetree('d:\test');
    end;end.
      

  4.   

    还有更简单的方法,目录非空也可以删,不过会弹出一个对话框说目录非空,有哪位高手知道原因和解决办法请贴出来共享。代码如下:var
      DDirectory:String;  //存放指定目录
      OpStruc:TSHFileOpStruct;
      FromBuf:Array[0..128] of Char;
    begin
      DDirectory:='D:\test' ;
      if DirectoryExists(DDirectory) then  //判断目录是否存在
      begin
        FillChar(FromBuf,Sizeof(FromBuf),0);//填充结构OpStruc
        StrPCopy(FromBuf,Pchar(DDirectory));
        with OpStruc do
        begin
          Wnd:=Handle;
          wFunc:=FO_DELETE;
          pFrom:=@FromBuf;
          pTo:=nil;
          fFlags:=FOF_NOCONFIRMATION;
          lpszProgressTitle:='';
        end;
        SHFileOperation(OpStruc);//调用API
      end;
      

  5.   

    fFlags:=FOF_NOCONFIRMATION; 改为
    fFlags:=FOF_NOCONFIRMATION or FOF_NOERRORUI;