我需要一个函数,给定一个path,告诉我它是否是一个回收站文件夹。 我试着用CSIDL_BITBUCKET使用像SHGetSpecialFolderPath函数,但是这不起作用,因为回收站是一个虚拟文件夹,它是所有驱动器的回收站的联合。
这个问题是要logging在http://blogs.msdn.com/oldnewthing/archive/2008/09/18/8956382.aspx发布的回复
从http://blogs.msdn.com/oldnewthing/archive/2008/09/18/8956382.aspx :
客户指出,他们不想硬编码RECYCLED和RECYCLER这个词,这是一个很好的决定,因为目录的名字取决于很多东西。 它…取决于文件系统。 这也取决于驱动器是本地访问还是远程访问。 基于网络的回收站文件夹遵循另一个命名方案。 它甚至可能取决于用户正在运行的操作系统。 不,硬编码回收站文件夹的名称不是一个好主意。
SHDESCRIPTIONID结构告诉你更多关于shell文件夹的信息。 除了“描述ID”之外,它也给了你一个CLSID,这里是相关的CLSID。
#include <windows.h> #include <shlobj.h> #include <tchar.h> #include <stdio.h> HRESULT GetFolderDescriptionId(LPCWSTR pszPath, SHDESCRIPTIONID *pdid) { HRESULT hr; LPITEMIDLIST pidl; if (SUCCEEDED(hr = SHParseDisplayName(pszPath, NULL,&pidl, 0, NULL))) { IShellFolder *psf; LPCITEMIDLIST pidlChild; if (SUCCEEDED(hr = SHBindToParent(pidl, IID_IShellFolder, (void**)&psf, &pidlChild))) { hr = SHGetDataFromIDList(psf, pidlChild,SHGDFIL_DESCRIPTIONID, pdid, sizeof(*pdid)); psf->Release(); } CoTaskMemFree(pidl); } return hr; } int __cdecl wmain(int argc, WCHAR **argv) { SHDESCRIPTIONID did; if (SUCCEEDED(GetFolderDescriptionId(argv[1], &did)) && did.clsid == CLSID_RecycleBin) { printf("is a recycle bin\n"); } else { printf("is not a recycle bin\n"); } return 0; }
GetFolderDescriptionId函数获取文件夹的路径并将其转换为ITEMIDLIST,以便它可以调用SHGetDataFromIDList来获取SHDESCRIPTIONID。 在这种情况下,我们关心的是CLSID是否是回收站。
C:\> checkrecycle C:\Windows is not a recycle bin C:\> checkrecycle C:\RECYCLER\S-1-5-21-2127521184-1604012920-1887927527-72713 is a recycle bin