2011-10-10 99 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。