获取Windows的“ShFileOperation”API以递归方式删除Delphi中的文件

时间:2009-10-19 22:01:05

标签: delphi

我使用以下代码删除大量文件

function FastDelete(const fromDir: string): Boolean;
var
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc := FO_DELETE;
    fFlags := FOF_FILESONLY or
              FOF_NOCONFIRMATION or
              FOF_NO_CONNECTED_ELEMENTS or
              FOF_NOERRORUI or
              FOF_NO_UI;
    pFrom := PChar(fromDir+'\*.*' + #0);
  end;
  Result := (0 = ShFileOperation(fos));
end;

如何让它以递归方式删除路径中的所有文件?

MSDN documentation

编辑

问题是 FOF_FILESONLY 标志 删除后,文件将被递归删除

2 个答案:

答案 0 :(得分:4)

来自MSDN documentation

  

<强> FOF_NORECURSION

     

仅在本地目录中执行操作。不要以递归方式操作子目录,这是默认行为

看起来那是你的答案。它应该自动递归,除非你不要求它。

编辑:看起来你的旗子有问题。您需要将 OR 组合在一起,而不是将它们添加到一起。由于FOF_NO_UI已包含FOF_NOERRORUI,因此再次添加可能会更改该值,您可能会意外添加一些加起来FOF_NORECURSION的内容。它应该是这样的:

    fFlags := FOF_FILESONLY or
              FOF_NOCONFIRMATION or
              FOF_NO_CONNECTED_ELEMENTS or
              FOF_NOERRORUI or
              FOF_NO_UI;

答案 1 :(得分:1)

你还要保留目录吗?如果没有,你可以通过

pFrom := PChar(fromDir+#0);

另一种选择是构建一个#0分隔文件路径列表,并从msdn传递额外的#0:

  

虽然此成员被声明为以null结尾的字符串,但它被用作保存多个文件名的缓冲区。每个文件名必须以单个NULL字符终止。必须在最终名称的末尾附加一个额外的NULL字符,以表示pFrom的结束。