【问题标题】:How do I detect if a drive has a recycle bin in C#?如何在 C# 中检测驱动器是否有回收站?
【发布时间】:2011-10-10 20:05:07
【问题描述】:

我有一个应用程序使用 FOF_ALLOWUNDO 和 SHFileOperation 来将文件移动到回收站。

某些可移动驱动器没有回收站。在这种情况下 SHFileOperation 直接删除文件。我想向用户发出警告,文件将被直接删除。

为此,我需要知道驱动器是否有回收站。

【问题讨论】:

  • 你可以在这里找到答案stackoverflow.com/questions/1585295/…
  • BoltClock,尽管没有回收站,但正确的方法可能是通过不实际删除而是移动到其他地方来提供撤消删除的选项。警告是用户永远不会阅读的内容,无论它有多大帮助。这个想法很好,我支持它,但它与用户面对的几乎所有其他消息框没有什么不同 - 它只会被未读并且无论如何都会出现投诉。
  • @Joey:你是对的。只是让我想起了 Gmail 珍贵的撤消功能。

标签: c# windows recycle-bin


【解决方案1】:

使用 FOF_WANTNUKEWARNING。

如果文件在删除操作期间被永久破坏而不是回收,则发送警告。此标志部分覆盖 FOF_NOCONFIRMATION。

【讨论】:

    【解决方案2】:

    在查看shell32.dll导出的函数时发现了一个叫SHQueryRecycleBin的函数。

    如果 pszRootPath 中指定的驱动器有回收站,则函数返回 0,否则返回 -2147467259。

    我将通过 PInvoke 使用此功能。

    我使用 P/Invoke Interop Assistant 创建 PInvoke 代码。

    这是我的函数DriveHasRecycleBin的代码:

    [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
        private struct SHQUERYRBINFO
        {
            /// DWORD->unsigned int
            public uint cbSize;
    
            /// __int64
            public long i64Size;
    
            /// __int64
            public long i64NumItems;
        }
    
        /// Return Type: HRESULT->LONG->int
        ///pszRootPath: LPCTSTR->LPCWSTR->WCHAR*
        ///pSHQueryRBInfo: LPSHQUERYRBINFO->_SHQUERYRBINFO*
        [System.Runtime.InteropServices.DllImportAttribute("shell32.dll", EntryPoint = "SHQueryRecycleBinW")]
        private static extern int SHQueryRecycleBinW([System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPTStr)] string pszRootPath, ref SHQUERYRBINFO pSHQueryRBInfo);
    
        public bool DriveHasRecycleBin(string Drive)
        {
            SHQUERYRBINFO Info = new SHQUERYRBINFO();
            Info.cbSize = 20; //sizeof(SHQUERYRBINFO)
            return SHQueryRecycleBinW(Drive, ref Info) == 0;
        }
    

    【讨论】:

      猜你喜欢
      • 2010-09-14
      • 2012-07-10
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2010-10-09
      相关资源
      最近更新 更多