Windows 10 1709系统中SHFileOperation删除文件夹速度过慢问题咨询
解决Windows 10 1709中SHFileOperation删除文件夹速度过慢的问题
我之前在排查Windows 10 1709(Fall Creators Update)版本的文件操作问题时,刚好碰到过和你一模一样的情况——用SHFileOperation删除只有2-3个文件的小文件夹居然慢得离谱,后来定位下来确实和Universal Windows(UWP)应用相关的新增系统机制有关。
问题根源分析
Windows 10 1709引入了针对UWP应用的文件访问管控增强机制,其中两个关键点会拖慢SHFileOperation的执行:
- UWP文件系统监控服务:系统新增了后台服务,用于跟踪UWP应用的文件访问行为,当你调用
SHFileOperation删除文件夹时,该服务会对目标路径进行额外的扫描与校验,哪怕文件夹内容极少也会触发这个流程。 - 旧API的兼容性适配:
SHFileOperation是比较老旧的API,在新系统中为了兼容UWP的权限模型,会额外执行一些权限检查逻辑,这也是导致操作延迟的原因之一。
可行的解决方案
1. 替换为现代API IFileOperation
微软在Windows Vista之后就推荐使用IFileOperation作为SHFileOperation的替代方案,它对新系统的兼容性更好,能避免旧API的适配问题。以下是对应你的删除逻辑的示例代码:
#include <Shobjidl.h> #include <atlbase.h> HRESULT DeleteTargetFolder(LPCWSTR folderPath) { // 初始化COM环境(如果你的程序还没初始化的话) HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); if (SUCCEEDED(hr)) { CComPtr<IFileOperation> pFileOp; hr = CoCreateInstance(CLSID_FileOperation, nullptr, CLSCTX_ALL, IID_PPV_ARGS(&pFileOp)); if (SUCCEEDED(hr)) { // 设置对应原代码的静默、无确认、无错误UI参数 hr = pFileOp->SetOperationFlags(FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI); if (SUCCEEDED(hr)) { CComPtr<IShellItem> pTargetItem; hr = SHCreateItemFromParsingName(folderPath, nullptr, IID_PPV_ARGS(&pTargetItem)); if (SUCCEEDED(hr)) { // 添加删除任务 hr = pFileOp->DeleteItem(pTargetItem, nullptr); if (SUCCEEDED(hr)) { // 执行删除操作 hr = pFileOp->PerformOperations(); } } } } CoUninitialize(); } return hr; }
2. 验证并规避UWP相关的目录管控
- 尽量避免删除UWP应用的受保护目录(比如系统默认的
Documents、Pictures库,或者UWP应用的安装目录),这些目录的权限校验更严格; - 关闭当前正在运行的所有UWP应用后再测试删除操作,确认是否是后台应用的文件监控导致的延迟。
3. 临时调整系统服务(仅用于验证问题)
如果只是想确认问题确实和UWP相关,可以临时暂停Windows Search服务(1709版本中该服务增强了对UWP文件的索引),然后再执行删除操作。注意:这只是临时验证手段,不建议长期关闭该服务。
内容的提问来源于stack exchange,提问作者Mark Scarbrough
相关产品推荐
相关产品推荐

