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



我在从软件中删除位于不同分区(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;

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

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

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

试试这个:

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/循环之外的其他人实际上正在使用这些目录,你可以使用SysInternals Process Explorer之类的工具来检查。

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

var f: file;
begin
  AssignFile(f,strFile);
  Erase(f);
end;

在这里,如果Erase()未完成,将引发一个异常,您可以收到更多信息,特别是在调试阶段。

相关内容

  • 没有找到相关文章

最新更新