如果请求FOF_NOERRORUI,则使用SHFileOperation复制目录结构失败

时间:2012-02-07 14:12:28

标签: winapi windows-shell shfileoperation

我有一个使用SHFileOperation的工作代码,用于将一个目录复制到另一个目录中。在这种情况下,这是Pascal代码,但我也在C ++中使用相同的函数,问题似乎与Windows核心有关,而不是特定的编程语言。

根据MSDN,我想指定以下标志组合:

FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI

也就是说,我不需要进度条,我通过隐含的“是”答案来抑制所有关于文件和目录的问题,我不希望在GUI(对话框)中出现任何错误消息。

使用这种标志组合,该函数返回错误0x4C7(由用户取消,这不是真的)。如果我删除了FOF_NOERRORUI,它在相同的输入参数和文件系统状态下工作正常。

不幸的是,我还需要禁止错误消息,并且需要FOF_NOERRORUI标志。

是否有人知道如何调整这些旗帜组合(可能是其他先决条件)以满足我的需求?

以下是那些可能认为存在错误的人的源代码:

function CopyDirectory(WindowHandle: HWND; FilenameFrom: string; FilenameTo: string): Boolean;
var
  SH: TSHFILEOPSTRUCT;
begin
  FillChar(SH, SizeOf(SH), 0);
  with SH do
  begin
    Wnd := WindowHandle;
    wFunc := FO_COPY;
    pFrom := PChar(FilenameFrom + #0);
    pTo := PChar(FilenameTo + #0);
    fFlags := FOF_NOCONFIRMMKDIR or FOF_NOCONFIRMATION or FOF_SILENT or FOF_NOERRORUI;
  end;
  Result := SHFileOperation(SH) = 0;
  Result := Result and (not SH.fAnyOperationsAborted);
end;

1 个答案:

答案 0 :(得分:4)

0x4C7实际上是:

  

“操作已被用户取消,或者如果向SHFileOperation 提供了适当的标志,则静默取消。”

如果您关闭所有标志并让操作运行,您会问什么样的问题?我的猜测是其中一个问题被回答为“否”,因为安全选项是这样做的。

<强>更新

您是否考虑过使用CopyFile() API函数?无需UI抑制。文档为here