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