2011-10-10 56 views
15

我有一个应用程序使用FOF_ALLOWUNDO SHFileOperation为了移动文件到回收站。如何检测驱动器在C#中是否有回收站?

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

为了做到这一点,我需要知道驱动器是否有回收站。

+1

您可以在这里找到你的答案 http://stackoverflow.com/questions/1585295/how-can-i-tell该目录是用于用户体验的+1回收bin-in-c –

+3

+1。 – BoltClock

+0

BoltClock,正确的方法可能会提供一个选项来撤消删除,但实际上并未删除,而是移动到其他位置,尽管没有回收站。警告是用户永远不会读的东西,不管它有多大的帮助。这个想法很好,我支持它,但与用户几乎所有其他消息框都没有什么不同 - 它将只是未读而且抱怨也随之而来。 – Joey

回答

1

当我查看由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; 
    } 
7

使用FOF_WANTNUKEWARNING。

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

相关问题