如何查看IFileOperation成功删除的文件有哪些?

后端开发 2026-07-12

我正在使用 IFileOperation::DeleteItems 来删除多个文件——其中包括一个我没有删除权限的文件。

使用标准的 IFileOperationProgressSink::PostDeleteItem 来在每个项的删除过程完成后获得通知:

HRESULT PostDeleteItem(
  [in] DWORD      dwFlags,
  [in] IShellItem *psiItem,
  [in] HRESULT    hrDelete,
  [in] IShellItem *psiNewlyCreated
);

它会对该文件的回调调用两次:

  1. 就在显示确认对话框之前:

  2. hrDelete == 0x80270002

  3. 如果我选择 Skip,它会再次调用 PostDeleteItem

  4. 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章