65.9K
CodeProject 正在变化。 阅读更多。
Home

检测回收站是否为空

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.69/5 (11投票s)

2008 年 3 月 12 日

CPOL

1分钟阅读

viewsIcon

28264

downloadIcon

207

如何检测回收站是否为空? 在本文中找到答案。

引言

我决定编写这段代码,是因为在网上看到很多关于检测回收站是否为空(不仅仅是空,而是检测是否有文件)的问题。源代码是一个 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 :)

© . All rights reserved.