如何查看IFileOperation成功删除的文件有哪些?
我正在使用 IFileOperation::DeleteItems 来删除多个文件——其中包括一个我没有删除权限的文件。
使用标准的 IFileOperationProgressSink::PostDeleteItem 来在每个项的删除过程完成后获得通知:
HRESULT PostDeleteItem(
[in] DWORD dwFlags,
[in] IShellItem *psiItem,
[in] HRESULT hrDelete,
[in] IShellItem *psiNewlyCreated
);
它会对该文件的回调调用两次:
-
就在显示确认对话框之前:
-
hrDelete == 0x80270002 -
如果我选择
Skip,它会再次调用 PostDeleteItem: -
hrDelete == 0x00270005
看起来像是成功。
如何判断对这个特定文件的文件操作并没有发生?
psiItem对两种情况都不是NULL。IFileOperation::GetAnyOperationsAborted报告TRUE
解决方案
虽然有点繁琐,但答案就在你的回调中:
它会调用你一次,告诉你无法复制该文件,并且将尝试提升权限:
hrDelete == 0x80270002(COPYENGINE_E_REQUIRES_ELEVATION)
然后在你点击 Skip 之后,它再次回调你,说该文件被跳过,因为用户跳过了它:
hrDelete == 0x00270005(COPYENGINE_S_USER_IGNORED)
在以下情况也会得到同样的结果:
- 目标文件已经存在
- 或目标不支持EFS加密
- 或目标磁盘空间不足
它会提示用户,如果用户选择 Skip,在用户同意跳过该文件后,你将收到通知,操作已成功完成:
hrDelete == 0x00270005(COPYENGINE_S_USER_IGNORED)
你可以在 sherrors.h 找到这些具体的HRESULT:
sherrors.h
// sherrors.h - Shell API error code values
// Copyright (c) Microsoft Corporation. All rights reserved.
...
#define COPYENGINE_E_REQUIRES_ELEVATION _HRESULT_TYPEDEF_(0x80270002L) // Need to elevate the process to complete the operation
#define COPYENGINE_S_USER_IGNORED _HRESULT_TYPEDEF_(0x00270005L)
提示:让Windows Search把 Windows SDK的头文件目录爬到索引里,这样你就可以在电脑上直接搜索 0x00270005,并立刻找到它。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。