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

标签 winapi windows-shell shfileoperation

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

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

FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI

也就是说,我不需要进度条,我通过隐含的"is"答案来抑制有关文件和目录的所有可能的问题,并且我不希望 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;

最佳答案

0x4C7 实际上是:

"The operation was canceled by the user, or silently canceled if the appropriate flags were supplied to SHFileOperation."

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

更新

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

关于winapi - 如果请求 FOF_NOERRORUI,则使用 SHFileOperation 复制目录结构失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9177758/

相关文章:

c# - 使用 .net 4.0 引用 Windows shell 接口(interface)

windows - SHFileOperation FOF_ALLOWUNDO 对长文件名失败

c++ - Directwrite:获取字体的高度

c++ - COM - 实现 DllGetClassObject

winapi - 我如何接受 MathML?

获取公共(public)库文件夹的 CSIDL 的 C++ Shell 函数

winapi - 如何将击键发送到窗口而无需使用 Windows API 激活它?

c - 使用 SHFileOperation 按日期删除文件和文件夹

c++ - SHFileOperation 使用字符串复制文件夹