无法从其他分区中删除文件夹

时间:2014-07-31 12:20:24

标签: delphi delphi-6

从我的软件中删除不同分区(E:/)上的文件夹时遇到问题。我可以使用DeleteFile功能删除文件,但我无法使用以下代码删除文件夹:

function RemoveDirectory(strDir : String) : Boolean;
var
  SearchRec : TSearchRec;
  strFile   : String;
  nResult   : Integer;
begin
  try
    Result := false;

    nResult := FindFirst(strDir + '*', faAnyFile, SearchRec);

    while (nResult = 0) do
      begin
        if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
          begin
            strFile := strDir +  SearchRec.Name;

            if FileExists(strFile) then
              DeleteFile(strFile)
            else if DirectoryExists(strFile) then
              RemoveDirectory(strFile);
          end;
        nResult := FindNext(SearchRec);
      end;

    Result := RemoveDir(strDir);
  finally
    FindClose(SearchRec);
  end;
end;

使用此代码,我可以从我的软件中删除同一分区上的文件夹。有人知道发生了什么事吗?是因为它在不同的分区上吗?

2 个答案:

答案 0 :(得分:4)

您仍尝试在仍有打开的搜索句柄时删除目录。由于这是一个递归函数,如果目录层次结构较深,则一次打开多个搜索句柄,这是在到达更深文件夹时使用的大量系统资源。

最好将直接子文件夹收集到临时列表中,然后在迭代该列表之前关闭当前搜索句柄。这样,一次只有一个搜索句柄处于活动状态,并且在实际删除每个文件夹时没有活动的搜索句柄。

试试这个:

function RemoveDirectory(strDir : String) : Boolean;
var
  SearchRec : TSearchRec;
  nResult,i : Integer;
  SubFolders: TStringList;
begin
  SubFolders := nil;
  try
    strDir := IncludeTrailingPathDelimiter(strDir);

    nResult := FindFirst(strDir + '*', faAnyFile, SearchRec);
    if (nResult = 0) then
    try
      repeat
        if (SearchRec.Attr and faDirectory) = 0 then
          DeleteFile(strDir + SearchRec.Name)
        else
        begin
          if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
          begin
            if not Assigned(SubFolders) then SubFolders := TStringList.Create;
            SubFolders.Add(strDir + SearchRec.Name);
          end;
        end;
      until FindNext(SearchRec) <> 0;
    finally
      FindClose(SearchRec);
    end;

    if Assigned(SubFolders) then
    begin
      for i := 0 to SubFolders.Count-1 do
        RemoveDirectory(SubFolders[i]);
    end;
  finally
    SubFolders.Free;
  end;

  Result := RemoveDir(strDir);
end;

如果仍然失败,那么app / loop之外的其他人实际上正在使用这些目录,您可以使用SysInternals Process Explorer之类的工具来检查。

答案 1 :(得分:-2)

DeleteFile()是布尔函数,只有成功与否才能收到信息。如果您想要更多详细信息,请返回普通的Erase():

var f: file;

begin
  AssignFile(f,strFile);
  Erase(f);
end;

此处,如果Erase()未完成,将引发异常,您可以收到更多信息,尤其是在调试阶段。