如何检查回收站是否为空

4

如果可能的话,我希望能够轻松地检查回收站是否为空(不需要导入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);

可惜的是,据我所知,您无法锁定回收站,因此即使您在实际清空之前检查它是否需要清空,某些其他进程仍可能悄悄地插入并在您检查并清空之前放置一个文件。 因此,该文件将不会被删除。 - Frédéric Hamidi
我愿意承担这个风险。基本上,如果我的代码检查回收站并发现它为空,然后采取相应措施,如果之后立即添加了一些内容到回收站,我也可以接受。 - MrVimes
2个回答

4
您可以添加对C:\Windows\System32\Shell32.dll的引用,并使用以下代码片段:
Shell shell = new Shell();
Folder recycleBin = shell.NameSpace(10);
int itemsCount = recycleBin.Items().Count;

以下内容摘自这里


谢谢。这个方法可行且简单易懂,我以后阅读代码时也能理解其中的运作原理。 - MrVimes

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接