如何检查回收站是否为空

时间:2014-01-04 21:33:37

标签: c#

如果可能的话,我希望能够检查回收站是否为空,只需要轻微的麻烦(导入dll,导入任何内容,创建整个新类来保存回收站功能等等)。

我已经在网上找到了以下代码来清空回收站,所以我很自然地怀疑我应该能够扩展它以检查它是否需要先清空,也许是Shell32.dll中的另一个函数。

enum BinFlags : uint
{
    SHERB_NOCONFIRMATION = 0x00000001,
    SHERB_NOPROGRESSUI = 0x00000002,
    SHERB_NOSOUND = 0x00000004
}


[DllImport("Shell32.dll", CharSet = CharSet.Unicode)]
static extern uint SHEmptyRecycleBin(IntPtr hwnd, string rootPath,
                                         BinFlags flags);

/* snip, bunch of code... */

SHEmptyRecycleBin(IntPtr.Zero, null, 0);

2 个答案:

答案 0 :(得分:3)

您可以添加对C:\Windows\System32\Shell32.dll的引用,并使用以下代码段:

Shell shell = new Shell();
Folder recycleBin = shell.NameSpace(10);
int itemsCount = recycleBin.Items().Count;

取自here

答案 1 :(得分:1)

文档很差,但您可能需要SHQueryRecycleBin编辑:在MSDN处提供更好的文档。

[DllImport("shell32.dll")]
static extern int SHQueryRecycleBin(string pszRootPath, ref SHQUERYRBINFO
   pSHQueryRBInfo);

[StructLayout(LayoutKind.Sequential, Pack=4)]
public struct SHQUERYRBINFO
{
    public int  cbSize;
    public long i64Size;
    public long i64NumItems;
}

看起来你打电话并填充对象,如果你看i64NumItems它是0然后回收站是空的。

public static int GetCount()
{
    SHQUERYRBINFO sqrbi = new SHQUERYRBINFO();
    sqrbi.cbSize = Marshal.SizeOf(typeof(SHQUERYRBINFO));
    int hresult = SHQueryRecycleBin(string.Empty, ref sqrbi);
    return (int)sqrbi.i64NumItems;
}