获取回收站中的文件原路径

利用Windows Shell 编程接口来获取回收站中的文件和在删除前的原路径
1、IShellFolder接口
  IShellFolder是Windows Shell 程序对目标进行管理的一个重要接口。每一个目录对于一个
  实例化的IShellFolder接口,包括EnumObject、GetAttributesOf、GetDisplayNameOf等
2、IEnumIDList 接口
     这个借口提供了一组标准的方法,用于遍历PIDL,包括Clone、Next、Reset、Skip等

DWORD ListFileInRecycleBin()
{
 TCHAR pszPath[MAX_PATH];  // 保存路径
 // IShellFolder接口
 IShellFolder *pisf = NULL;
 IShellFolder *pisfRecBin = NULL;
 // 获取“根”目录,桌面
 SHGetDesktopFolder(&pisfRecBin);

 IEnumIDList *peidl = NULL; // 对象遍历接口
 LPITEMIDLIST pidlBin = NULL;
 LPITEMIDLIST idlCurrent = NULL;

 LPMALLOC pMalloc = NULL;
 // 分配
 SHGetMalloc(&pMalloc);
 // 回收站位置
 SHGetFolderLocation(NULL, CSIDL_BITBUCKET, NULL, 0, &pidlBin);
 // 绑定回收站对象
 pisfRecBin->BindToObject(pidlBin,NULL,IID_IShellFolder,(void **) &pisf);
 // 列举回收站中的对象,得到IEnumIDList接口,包括SHCONTF_FOLDERS、
 // SHCONTF_NONFOLDERS、SHCONTF_INCLUDEHIDDEN类型的对象
 pisf->EnumObjects(NULL,
  SHCONTF_FOLDERS | SHCONTF_NONFOLDERS |SHCONTF_INCLUDEHIDDEN,
  &peidl);

 STRRET strret;
 ULONG uFetched;

 HANDLE hOutPut = GetStdHandle(STD_OUTPUT_HANDLE);
 printf("\nFiles In Recycle Bin:\n");

 while(1)
 {
  // 遍历IEnumIDList对象,idlCurrent为当前对象
  if(peidl->Next(1,&idlCurrent,&uFetched) == S_FALSE)
   break;
  // 获取回收站当前对象当前的路径,这里没有输出结果,读者可自行修改
  SHGetPathFromIDList(idlCurrent,  pszPath);
  // DisplayName,删除前的路径
  pisf->GetDisplayNameOf(idlCurrent,SHGDN_NORMAL,&strret);
  // 显示,printf可能会造成字符编码不正确。
  WriteConsoleW(hOutPut,L"\t",1,NULL,NULL);
  WriteConsoleW(hOutPut,strret.pOleStr,lstrlenW(strret.pOleStr),NULL,NULL);
  WriteConsoleW(hOutPut,L"\n",1,NULL,NULL);
 }
 // 释放资源
 pMalloc->Free(pidlBin);
 pMalloc->Free(strret.pOleStr);
 pMalloc->Release();
 peidl->Release();
 pisf->Release();
 return 0; 
}

代码来源于《精通Windows API - 函数 接口 编程实例》一书

转载于:https://www.cnblogs.com/anhuizhxd/archive/2009/09/17/WindowsShell1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值