如何取回收站的真实可访问路径?

hiloves 2016-10-10 12:40:22
问题是这样:
1、我想取每个分区下回收站目录的真实可访问路径。比如取D盘下回收站目录:D:\$RECYCLE.BIN\S-1-5-21-2391778692-3005603467-80961625-1001\。(这个是Win10 NTFS下的路径)。
2、或者可以取回收站下被删除文件的真实可访问路径。比如D盘下回收站内文件的路径:D:\$RECYCLE.BIN\s-1-5-21-2391778692-3005603467-80961625-1001\$r0hbuu1.txt。(可不是取删除文件的原名)。


我的进展现在是这样的:
1、SHQueryRecycleBin这个没用,只能取回收站内文件数和总大小。PASS了。
2、SHGetSpecialFolderLocation、SHGetSpecialFolderPath、SHGetFolderLocation、SHGetFolderPath、SHGetKnownFolderPath,这些没用,回收站是虚拟目录没办法取一个单独的实体路径,返回结果都是空的。PASS了。
3、翻了以前的贴子发现了这个http://www.codeproject.com/Articles/2783/How-to-programmatically-use-the-Recycle-Bin。
用回收站的IShellFolder2遍历底下的文件,取文件的PIDL。
	hr = m_pFolder2->EnumObjects(m_hWnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS| SHCONTF_INCLUDEHIDDEN, &penumFiles);
if (SUCCEEDED (hr))
{
// Iterate through list
while (penumFiles->Next(1, &pidl, NULL) != S_FALSE)
{
SHGetNameFromIDList(pidl, SIGDN_PARENTRELATIVE, szPath);
SHGetPathFromIDList(pidl, szPath);
iItem = m_List.InsertItem (iItem, _T(""));
m_List.SetItemData (iItem, (DWORD)pidl);

ZeroMemory (&fi, sizeof (fi));
hr = SHGetFileInfo ((LPCSTR)pidl, 0, &fi, sizeof (fi), SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_PIDL);

if (SUCCEEDED (hr))
{
iIndex = fi.iIcon;
m_List.SetItem (iItem, 0, LVIF_IMAGE, NULL, iIndex, 0, 0, 0);
}

// We iterate now in all the available columns.
// Since it depends on the system, we "hope" that they are going to be as many
// and in the same order as when we have added the column's headers.

hr = S_OK;
for (iSubItem = 0; iSubItem < iItemG; iSubItem++)
{
hr = m_pFolder2->GetDetailsOf (pidl , iSubItem, &sd);
if (SUCCEEDED (hr))
{
switch (sd.str.uType)
{
case STRRET_CSTR:
_tcscpy (szTemp, sd.str.cStr);
break;
case STRRET_OFFSET:
break;
case STRRET_WSTR:
WideCharToMultiByte (CP_ACP, 0, sd.str.pOleStr, -1, szTemp, sizeof (szTemp), NULL, NULL);
pMalloc->Free (sd.str.pOleStr);
break;
}
m_List.SetItemText (iItem, iSubItem, szTemp);
}
}
}
}

里面有两个函数:SHGetNameFromIDList和SHGetPathFromIDList,取出来的回收站文件路径都是取对桌面路径的不是真实的。比如取来是这德兴:C:\\Users\\USER\\Desktop\\$R2EFQ0W。这两个也不能用。PASS了。
4、上面的SHGetFileInfo,取出来的SHFILEINFO结构中szDisplayName[MAX_PATH]是空的。PASS了。
5、上面的m_pFolder2->GetDetailsOf (pidl , iSubItem, &sd),这一行如果是执行GetDetailsOf (pidl , 189, &sd)取“路径”信息,结果是D:\$RECYCLE.BIN\回收站\$r0hbuu1.txt(NTFS)或D:\回收站\$r0hbuu1.txt(FAT)。到现在为止这个是最接近实际的了,但是这个路径复制到资源管理器里会提示找不到路径,说明仍然不是最实际的路径。

我现在没招了,还有没有其他API可以用?
...全文
788 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-10-12
  • 打赏
  • 举报
回复
引用 12 楼 HiLoveS 的回复:
[quote=引用 11 楼 zhao4zhong1 的回复:] C:\>dir /ad /b \RECYCLER\*.* S-1-5-21-3287820392-1537789725-1580799788-500
你的系统是XP吧。如果没有一个API可以获得不同Windows版本下的回收站路径,那只能是通过检测Windows版本和当前用户的SID自己生成路径了。[/quote] 暴露了我的年龄!
java_charpnet 2016-10-12
  • 打赏
  • 举报
回复
有真实文件名的,逆向下DeleteFile,记得有个zw函数可以得到的
hiloves 2016-10-12
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
C:\>dir /ad /b \RECYCLER\*.* S-1-5-21-3287820392-1537789725-1580799788-500
你的系统是XP吧。如果没有一个API可以获得不同Windows版本下的回收站路径,那只能是通过检测Windows版本和当前用户的SID自己生成路径了。
赵4老师 2016-10-12
  • 打赏
  • 举报
回复
C:\>dir /ad /b \RECYCLER\*.* S-1-5-21-3287820392-1537789725-1580799788-500
hiloves 2016-10-12
  • 打赏
  • 举报
回复
引用 13 楼 java_charpnet 的回复:
有真实文件名的,逆向下DeleteFile,记得有个zw函数可以得到的
zw系列函数可能可行吧,现阶段我暂时没找到具体哪个函数,不过zw系列函数是运行在内核模式下的,用户模式下无法调用。
hiloves 2016-10-11
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}]
@="回收站"
"InfoTip"=hex(2):40,25,53,79,73,74,65,6d,52,6f,6f,74,25,5c,73,79,73,74,65,6d,\
33,32,5c,53,48,45,4c,4c,33,32,2e,64,6c,6c,2c,2d,32,32,39,31,35,00
"SortOrderIndex"=dword:00000060
"IntroText"=hex(2):40,25,53,79,73,74,65,6d,52,6f,6f,74,25,5c,73,79,73,74,65,6d,\
33,32,5c,53,48,45,4c,4c,33,32,2e,64,6c,6c,2c,2d,33,31,37,34,38,00
"LocalizedString"=hex(2):40,25,53,79,73,74,65,6d,52,6f,6f,74,25,5c,73,79,73,74,\
65,6d,33,32,5c,53,48,45,4c,4c,33,32,2e,64,6c,6c,2c,2d,38,39,36,34,00


很遗憾,没有可用信息。
赵4老师 2016-10-11
  • 打赏
  • 举报
回复
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}] @="回收站" "InfoTip"=hex(2):40,25,53,79,73,74,65,6d,52,6f,6f,74,25,5c,73,79,73,74,65,6d,\ 33,32,5c,53,48,45,4c,4c,33,32,2e,64,6c,6c,2c,2d,32,32,39,31,35,00 "SortOrderIndex"=dword:00000060 "IntroText"=hex(2):40,25,53,79,73,74,65,6d,52,6f,6f,74,25,5c,73,79,73,74,65,6d,\ 33,32,5c,53,48,45,4c,4c,33,32,2e,64,6c,6c,2c,2d,33,31,37,34,38,00 "LocalizedString"=hex(2):40,25,53,79,73,74,65,6d,52,6f,6f,74,25,5c,73,79,73,74,\ 65,6d,33,32,5c,53,48,45,4c,4c,33,32,2e,64,6c,6c,2c,2d,38,39,36,34,00
hiloves 2016-10-11
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
注册表中搜索。
你觉得有用吗?
赵4老师 2016-10-11
  • 打赏
  • 举报
回复
注册表中搜索。
hiloves 2016-10-10
  • 打赏
  • 举报
回复
引用 5 楼 fefe82 的回复:
FindFirstFile, FileNextFile ... 系列的是不是就行 ...
你跟我说的正好相反,FindFirstFile, FileNextFile是知道文件夹名去取文件,我说的是只知道是回收站,但不知道回收站的具体名字。
fefe82 2016-10-10
  • 打赏
  • 举报
回复
FindFirstFile, FileNextFile ... 系列的是不是就行 ...
hiloves 2016-10-10
  • 打赏
  • 举报
回复
引用 1 楼 fefe82 的回复:
引用
这个路径复制到资源管理器里会提示找不到路径,说明仍然不是最实际的路径。
资源管理器里的路径可不是真实的路径 ... 资源管理器也可以不显示真实的文件夹内容。 你在资源管理器里输入 回收站 就可以知道进到回收站。
说是这么说,我是希望能和WinHex下显示的回收站路径一样。
hiloves 2016-10-10
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
看是不是实际路径不能通过看资源管理器里能不能打开
说是这么说,我是希望能和WinHex下显示的回收站路径一样。
paschen 版主 2016-10-10
  • 打赏
  • 举报
回复
看是不是实际路径不能通过看资源管理器里能不能打开
fefe82 2016-10-10
  • 打赏
  • 举报
回复
引用
这个路径复制到资源管理器里会提示找不到路径,说明仍然不是最实际的路径。
资源管理器里的路径可不是真实的路径 ... 资源管理器也可以不显示真实的文件夹内容。 你在资源管理器里输入 回收站 就可以知道进到回收站。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧