Windows回收站无全局路径,按用户+驱动器分存于$Recycle.BinSID;GetRecycleBinDirectoryA/W需传入带冒号根路径(如"C:"),否则失败;SHQueryRecycleBinW仅统计当前用户跨卷逻辑大小,不包含硬链接等底层开销。

GetRecycleBinDirectoryA / GetRecycleBinDirectoryW 返回空?
Windows 没有全局统一的“回收站路径”,它按用户+驱动器分卷存储,比如 C:$Recycle.BinS-1-5-21-xxx,而 GetRecycleBinDirectoryA 只对**当前用户在指定驱动器上的回收站目录**有效,且必须传入带冒号的驱动器根路径(如 "C:\"),传 "C:" 或 "." 都会失败返回 0。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 先用
GetLogicalDrives()或GetDriveTypeA("C:\") == DRIVE_FIXED筛出本地固定磁盘 - 对每个有效驱动器调用
GetRecycleBinDirectoryW(L"C:\", pathBuf, MAX_PATH),注意第二个参数是LPWSTR,需用宽字符缓冲区 - 若返回 0,检查
GetLastError()—— 常见是ERROR_ACCESS_DENIED(非管理员查系统卷时可能受限)或ERROR_INVALID_PARAMETER(路径格式错)
SHQueryRecycleBinW 统计不准?
SHQueryRecycleBinW 是唯一能跨卷汇总回收站总大小和文件数的 API,但它返回的是逻辑大小(QUOTAUSED),不是磁盘实际占用;且仅反映**当前登录用户**的回收站内容,其他用户(如 Administrator、其它 profile)的回收站完全不可见。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 必须用宽字符调用:
SHQueryRecycleBinW(NULL, &rbinfo),第一个参数为NULL表示汇总所有已挂载卷 -
rbinfo.dwSize必须初始化为sizeof(rbinfo),否则 Win10+ 会直接返回E_INVALIDARG - 返回成功后,
rbinfo.ullSize是字节数,但可能比资源管理器显示的小 —— 因为它不包含 NTFS 硬链接、压缩/加密属性开销等底层细节
需要遍历所有用户回收站?得绕过权限限制
系统级回收站路径(如 C:$Recycle.Bin* 下的 SID 子目录)默认受 ACL 保护,普通用户进程无法列出或访问其他用户的子目录。强行用 FindFirstFileW 扫描会卡在 ACCESS_DENIED,且不能跳过。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 放弃“全量扫描”思路 —— 没有安全、稳定、无需提权的方式做到这点
- 若必须估算整机回收站容量,可结合:
GetDiskFreeSpaceExW查 C 盘剩余空间,再用GetDiskFreeSpaceExW查 C 盘原始总空间,差值只是粗略上限(含页面文件、休眠文件等) - 真要进其他用户目录?需以
SYSTEM权限运行 + 调用SetPrivilege(SE_BACKUP_NAME)+BackupRead,但这已超出常规应用范畴,且 Vista 后多数策略禁止非系统服务这么做
64 位程序读取 32 位回收站路径要注意什么?
没有“32 位回收站路径”这回事 —— 回收站位置与进程位数无关,只取决于 Windows 版本(Win7+ 全部用 $Recycle.Bin)和用户 SID。但常见坑是:用 GetModuleFileNameA 获取当前路径后拼接 "..\..\$Recycle.Bin" 这类硬编码,既不合法也不可靠。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 永远以驱动器为单位调用
GetRecycleBinDirectoryW,而不是猜路径 - 宽字符 API(
W版本)是唯一推荐方式,A版本在路径含 Unicode 字符(如中文用户名)时必然失败 - 编译时确保定义了
UNICODE和_UNICODE,否则TEXT("...")宏会展开错误,SHQueryRecycleBinW可能静默失败
回收站不是普通文件夹,它的路径结构、ACL、统计口径都由 shell 和卷管理器协同维护。想绕过 SHQueryRecycleBinW 自己递归计算,大概率漏掉硬链接、被压缩的文件,或者直接被权限拦住 —— 别省那点 API 调用,老实用它。



















