【问题标题】:How to check if the recycle bin is empty如何检查回收站是否为空
【发布时间】:2014-01-04 21:33:37
【问题描述】:

如果可能的话,我希望能够检查回收站是否为空,并尽量减少麻烦(导入 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);

【问题讨论】:

  • 唉,据我所知,您无法锁定回收站,所以即使您在实际清空它之前检查它是否需要清空,其他一些进程可能会潜入并在您之后立即删除文件在清空之前检查和。因此,该文件不会被删除。
  • 我愿意接受这个风险。基本上,如果我的代码检查回收站 - 发现它是空的 - 然后采取相应的行动,然后立即将一些东西添加到回收站..我可以接受。

标签: c#


【解决方案1】:

您可以添加对C:\Windows\System32\Shell32.dll 的引用并使用以下sn-p:

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

取自here

【讨论】:

  • 谢谢。这很有效并且很简单。以后再看我的代码我就能明白是怎么回事了。
【解决方案2】:

文档很差,但您可能想要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;
}

【讨论】:

    猜你喜欢
    • 2011-01-22
    • 1970-01-01
    • 2017-11-15
    • 2020-05-29
    • 2018-04-02
    • 2016-04-05
    • 2018-01-08
    • 2020-09-25
    • 2012-01-15
    相关资源
    最近更新 更多