VC-如何删除回收站里的某指定文件?
微软提供了一个SHEmptyRecycleBin可以清空整个回收站,但是如果只想删除其中某一个文件,该怎么处理?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
微软提供了一个SHEmptyRecycleBin可以清空整个回收站,但是如果只想删除其中某一个文件,该怎么处理?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(1)
void DeleteFileFromRecycleShell(const CString& sFileName)
{
HRESULT hr;
// Call this if needed.
CoInitialize( NULL );
IShellFolder* pRecycleFolder = NULL;
IMalloc* pMalloc = NULL;
hr = ::SHGetMalloc(&pMalloc);
// Get desktop folder.
hr = ::SHGetDesktopFolder(&pRecycleFolder);
// Get the recycleBin folder.
ITEMIDLIST* pidlRecycleFolder = NULL;
hr = ::SHGetSpecialFolderLocation(NULL, CSIDL_BITBUCKET, &pidlRecycleFolder);
// Get the IShellFolder of the recycleBin folder.
IShellFolder* pHistoryFolder = NULL;
hr = pRecycleFolder ->BindToObject(pidlRecycleFolder, NULL, IID_IShellFolder, (void**)&pRecycleFolder );
// Enumerate the recycleBin items.
IEnumIDList* pRecycleEnum = NULL;
hr = pRecycleFolder->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &pRecycleEnum );
ITEMIDLIST* pidl = NULL;
ULONG fetched = 0;
hr = pRecycleEnum ->Next(1, &pidl, &fetched);
STRRET strret;
if (SUCCEEDED(hr))
{
TCHAR pszPath[MAX_PATH]; // 保存路径
const ITEMIDLIST* pidl2 = pidl;
pisf->GetDisplayNameOf(idlCurrent,SHGDN_NORMAL,pszPath);
if(sFileName == pszPath)
{
// Get the IContextMenu interface.
IContextMenu* pContextMenu = NULL;
hr = pRecycleFolder->GetUIObjectOf(NULL, 1, &pidl2, IID_IContextMenu, NULL, (void**)&pContextMenu);
if (SUCCEEDED(hr))
{
CMINVOKECOMMANDINFO pCommandInfo = { 0 };
pCommandInfo.cbSize = sizeof(CMINVOKECOMMANDINFO);
pCommandInfo.lpVerb = _T("delete");
pCommandInfo.fMask = CMIC_MASK_FLAG_NO_UI; // has no effect
hr = pContextMenu->InvokeCommand(&pCommandInfo);
}
pContextMenu->Release();
}
}
pRecycleEnum ->Release();
pRecycleFolder->Release();
pMalloc->Release();
pidlRecycleFolder->Release();
}