用ShellAPI函数,不知道为什么,总是会出现 无法删除源文件:无法读取源文件或磁盘  的错误,但我手动去删又没问题,  function TForm1.DeleteDir(const Handle: THandle; const str: string): Boolean;
  var
    f: TSHFileOpStruct;
  begin
    if DirectoryExists(str) then
    begin
      FillChar(f, SizeOf(f), 0);
      f.Wnd := Handle;
      f.wFunc := FO_DELETE;
      f.pFrom :=  PAnsiChar(str);
      f.fFlags := FOF_NOCONFIRMATION;
      if SHFileOperation(f) = 0 then
        Result:= true
      else
        Result:= False;
    end else
      Result := False;
  end;
各位大侠知道哪出问题的话请指点一下小弟,另外求用递归法删除文件夹的方法
删除当前文件夹下的文件我会,删除目录可以RemoveDir,怎么说呢,应该算是算法方面的问题了,弄的我头疼哪位大侠帮帮忙吧,小弟拜谢了

解决方案 »

  1.   

    //path是需删除的目录路径   //目录成功删除返回True,否则返回False   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.   

    这样的例子网上N多http://lysoft.7u7.net
      

  3.   

    试试这个function TForm1.DeleteTree(const path: string): Boolean;
    var
      sr: TSearchRec;
    begin
      if DirectoryExists(path) then
      begin
        ChDir(path);
        if FindFirst('*.*',faAnyFile,sr)=0 then
        begin
          repeat
            if ((sr.Attr and faDirectory)=16) and (sr.Name<>'.') and (sr.Name<>'..') then
            begin
              if DeleteTree(sr.Name) then
                memo1.Lines.Add('删除目录  '+sr.Name)
              else
                memo1.Lines.Add('删除失败  '+sr.Name);
            end else
            if ((sr.Attr and faDirectory)<>16) and (sr.Name<>'.') and (sr.Name<>'..') then
            begin
              SysUtils.FileSetAttr(sr.Name, 0);
              if DeleteFile(sr.Name) then
                memo1.Lines.Add('删除文件  '+GetCurrentDir+'\'+sr.Name)
              else
                memo1.Lines.Add('删除失败  '+GetCurrentDir+'\'+sr.Name);
            end;
            Application.ProcessMessages;
          until FindNext(sr)<>0;
          FindClose(sr);
        end;
        ChDir('..');
        Result := RemoveDir(path);
      end else
        Result := False;
    end;