Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 如果请求FOF_NOERRORUI,则使用SHFileOperation复制目录结构失败_Winapi_Windows Shell_Shfileoperation - Fatal编程技术网

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

Winapi 如果请求FOF_NOERRORUI,则使用SHFileOperation复制目录结构失败,winapi,windows-shell,shfileoperation,Winapi,Windows Shell,Shfileoperation,我有一个工作代码,利用SHFileOperation将一个目录复制到另一个目录。在这种情况下,这是Pascal代码,但我也一直在使用C++中的相同函数,问题似乎与Windows核心相关,而不是具体的编程语言。 根据MSDN,我想指定以下标志组合: FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI 也就是说,我不需要进度条,我通过隐含的“是”答案抑制所有可能的关于文件和目录的问题,并且我不希望GUI(对话框)

我有一个工作代码,利用SHFileOperation将一个目录复制到另一个目录。在这种情况下,这是Pascal代码,但我也一直在使用C++中的相同函数,问题似乎与Windows核心相关,而不是具体的编程语言。 根据MSDN,我想指定以下标志组合:

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

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

不幸的是,我还需要抑制错误消息,并且需要FOF_NOERRORUI标志

有人知道应该如何调整这些标志组合(可能是其他先决条件)以满足我的需要吗

以下是可能认为存在某些bug的人的源代码:

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实际上是:

该操作已被用户取消,或者如果为SHFileOperation提供了适当的标志,则以静默方式取消

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

更新

您是否想过使用
CopyFile()
API函数?不需要UI抑制。文档是。

0x4C7实际上是:

该操作已被用户取消,或者如果为SHFileOperation提供了适当的标志,则以静默方式取消

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

更新


您是否想过使用
CopyFile()
API函数?不需要UI抑制。文档是。

唉,在正常(无标志)情况下没有问题。但是,例如,如果其中一个文件被其他应用程序锁定,我会收到一条错误消息。我需要抑制这种用户界面的东西。对于我的要求,您建议使用哪种标志组合?你上面提到的“安全选项”是什么?唉,在正常(无标志)情况下没有问题。但是,例如,如果其中一个文件被其他应用程序锁定,我会收到一条错误消息。我需要抑制这种用户界面的东西。对于我的要求,您建议使用哪种标志组合?什么是“安全选项”?你提到上面的?@ TLama,我不认为<代码> Delphi < /C>和<代码> Pascal < /Cord>标签是合适的,因为问题在于shell API,并且在C++中同样可以复制代码(正如我在该问题中提到的)。使用
Delphi
标记可能会缩小受众范围,消除熟悉shell但在其忽略列表中添加
Delphi
和/或
Pascal
的人。@TLama,我认为
Delphi
Pascal
标记不合适,因为问题在于shell API,并且在C++中同样可以复制代码(正如我在这个问题中提到的)。使用
Delphi
标记可能会缩小受众范围,消除熟悉shell但在其忽略列表中添加
Delphi
和/或
Pascal
的人。