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( "\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 ; } |