C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
/*************************************
* DWORD ListFileInRecycleBin() * 功能 遍历并显示回收站中的文件 * * 参数 未使用 **************************************/ DWORD ListFileInRecycleBin() { CHAR 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(" Files In Recycle Bin: "); 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" ",1,NULL,NULL); WriteConsoleW(hOutPut,strret.pOleStr,lstrlenW(strret.pOleStr),NULL,NULL); WriteConsoleW(hOutPut,L" ",1,NULL,NULL); } // 释放资源 pMalloc->Free(pidlBin); pMalloc->Free(strret.pOleStr); pMalloc->Release(); peidl->Release(); pisf->Release(); return 0; } |