怎么获取回收站里的真实文件名

如何获取回收站里的真实文件名
我们知道回收站是一个分区中的一个特殊文件夹,名字类似$RECYCLE.BIN。比如我们X盘中有一个1.txt文件,我们直接删除放入回收站,那么感觉尽管我们看回收站中的名字是1.txt,但是实际上并不是。因为我们这时从回收站中重新拖出来,其源路径是 X:\$RECYCLE.BIN\S-1-5-21-……\$RXGT62B.txt这样的形式,目的路径是Des:\$RXGT62B.txt这样的形式,现在问题是我们在程序中如何可以获取这个看似随机的文件名$RXGT62B.txt的真实文件名,即最初的1.txt


------解决方案--------------------
C/C++ code

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; 
}