在Windows服务中使用SHFileOperation

在Windows服务中使用SHFileOperation,windows,winapi,service,shell32,Windows,Winapi,Service,Shell32,这是可能的,但在Windows服务中使用SHFileOperation是否合适?shell32.dll中的所有SHxxx API函数似乎都是在编写用户级程序时考虑到的。我能确定SHFileOperation永远不会显示GUI吗?我会说,这不合适,也不可取。大多数shell32 API的编写都有一个基本的理解,即它们将用于交互过程。我认为没有任何方法可以保证SHFileOperation永远不会显示UI组件。事实上,如果您查看(这是取代SHFileOperation的新Vista界面),它会清楚地

这是可能的,但在Windows服务中使用SHFileOperation是否合适?shell32.dll中的所有SHxxx API函数似乎都是在编写用户级程序时考虑到的。我能确定SHFileOperation永远不会显示GUI吗?

我会说,这不合适,也不可取。大多数shell32 API的编写都有一个基本的理解,即它们将用于交互过程。我认为没有任何方法可以保证SHFileOperation永远不会显示UI组件。事实上,如果您查看(这是取代SHFileOperation的新Vista界面),它会清楚地指出:

公开用于复制、移动、重命名、创建和删除Shell项的方法,以及用于提供进度和错误对话框的方法。此接口取代SHFileOperation函数

根据文档,您可以使用以下标志来防止出现任何UI:

FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR
或者(如果您的目标是Windows Vista),
FOF\u NO\u UI
,与上述内容相同


查看Windows SDK中的
ShellAPI.h
头文件,对
FOF_NO_UI
的评论说“根本不显示任何UI”,因此我认为可以使用
SHFileOperation
我不得不同意:不合适或不可取

使用SHFileOperation的主要原因是使用UI执行操作和/或可反转的操作。即,使用SHFileOperation删除文件将把文件放在回收站中,而不是删除它们,从而允许当前交互用户取消删除或撤消执行的操作。
由于这些服务在非交互式桌面上运行,因此没有人能够清除该回收站。

我也遇到了这个问题,正在努力在服务器和网络共享之间实现安全可靠的网络文件拷贝(这些共享大多基于CIFS/NetApp文件管理器)而且
SHFileOperation
有时会失败

现在开始使用
ROBOCOPY
(从Vista/Server 2008开始,所有Microsoft操作系统都默认提供),看起来非常有趣和可靠


这让我大开眼界:

在这一点上,我同意。我考虑使用它,因为它似乎可以复制文件及其安全描述符。标准CopyFile没有,因此需要额外的代码才能获得相同的行为。