检测回收站是否为空






2.69/5 (11投票s)
如何检测回收站是否为空? 在本文中找到答案。
引言
我决定编写这段代码,是因为在网上看到很多关于检测回收站是否为空(不仅仅是空,而是检测是否有文件)的问题。源代码是一个 COM 组件,将对“真正的 C# 程序员”有所帮助。
背景
如果你是 C++ 程序员,你必须了解 Shell 编程以及 shlguid.h 和 shlobj.h 包含的内容。如果你是 C# 程序员……嗯,什么是 Shell,以及指针? :))) 事实上,我创建 COM 是为了让 C# 程序员更容易地将这段代码导入到他们的应用程序中,而无需使用 PInvoke 等方法…
使用代码
C++ 程序员可以随意使用:使用 COM 或直接从 RecycleBinOps 中复制 "IsEmpty" 函数(不要忘记将返回值从 HRESULT 修改为 BOOL)。C# 程序员:添加引用 -> 选择 Com 选项卡 -> 选择 "CommShell v1.0" 组件并按确定 -> 在你的代码中编写:"using CommShellLib",并在你的方法中添加类似如下内容
IRecycleBinOps recBin = new RecycleBinOps();
if (recBin.IsEmpty() == 1)
return true;
else
return false;
事实上,函数源代码是这样的(所以你可能不需要下载源代码)
BOOL bResult = FALSE;
LPSHELLFOLDER pDesktop = NULL;
LPITEMIDLIST pidlRecycleBin = NULL;
HRESULT hr = S_OK;
LPSHELLFOLDER m_pRecycleBin;
LPENUMIDLIST penumFiles = NULL;
LPITEMIDLIST pidl = NULL;
LPMALLOC pMalloc = NULL;
hr = SHGetDesktopFolder(&pDesktop);
hr = SHGetSpecialFolderLocation (NULL, CSIDL_BITBUCKET, &pidlRecycleBin);
hr = pDesktop->BindToObject(pidlRecycleBin, NULL, IID_IShellFolder,
(LPVOID *)&m_pRecycleBin);
SHGetMalloc(&pMalloc); // windows memory management pointer needed later
hr = m_pRecycleBin->EnumObjects(NULL,
SHCONTF_FOLDERS|SHCONTF_NONFOLDERS| SHCONTF_INCLUDEHIDDEN,
&penumFiles);
if(SUCCEEDED (hr))
{
while(penumFiles->Next(1, &pidl, NULL) != S_FALSE)
{
bResult = TRUE;
break;
}
}
if (NULL != penumFiles)
{
penumFiles->Release ();
penumFiles = NULL;
}
pMalloc->Release();
return bResult;
思路很简单:我们使用 SHGetSpecialFolderLocation 获取回收站的指针,然后开始枚举该指针中的对象。所有信息都来自 MSDN,其中这些函数描述得非常详细。我只是按照我需要的方式使用了它们。历史
版本 1.0 :)