在使用Shell32DLL SHFileOperation / SHFILEOPSTRUCT时,跨驱动器移动系统文件会导致fAnyOperationsAborted为TRUE

时间:2018-03-22 09:15:58

标签: c# winapi shell32.dll

当使用Shell32DLL SHFileOperation进行文件操作时,我遇到了一个与跨驱动器移动系统文件有关的问题(例如c:\到d :)。

移动时,将通过系统对话框提示用户,询问“您确定要移动此系统文件吗?[是,跳过,取消]”

这是我的移动操作的核心要素:

SHFILEOPSTRUCT struc = new SHFILEOPSTRUCT();
struc.pFrom = fromPtr;
struc.pTo = toPtr;
struc.wFunc = FO_MOVE;
struc.fFlags = 0; // no relevant flags for this
struc.hwnd = 0;
struc.lpszProgressTitle = string.Empty;
struc.fAnyOperationsAborted = false; // initialized to FALSE

int res = SHFileOperation(ref struc);

操作返回0x0即成功,但返回的fAnyOperationsAborted为TRUE,即使用户已接受移动系统文件。在这种情况下,我希望操作返回fAnyOperationsAborted = FALSE。

问题在于我无法区分用户接受,跳过或取消操作,因为在所有三种情况下fAnyOperationsAborted都为TRUE。

如何解决这个问题?

关于SHFileOperation函数的MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/bb762164(v=vs.85).aspx

1 个答案:

答案 0 :(得分:0)

FOF_NOCONFIRMATION和/或FOF_NO_UI标志有帮助吗?

如果不是,您可以使用IFileOperation代替(Vista +)。如果你添加一个接收器,那么IFileOperationProgressSink::PostMoveItem会告诉你每个移动操作的HRESULT