Как определить, есть ли на диске корзина в C #? - PullRequest
15 голосов
/ 11 октября 2011

У меня есть приложение, которое использует FOF_ALLOWUNDO с SHFileOperation для перемещения файлов в корзину.

Некоторые съемные диски не имеют корзины.В этом случае SHFileOperation удаляет файлы напрямую.Я хочу предупредить пользователя о том, что файлы будут удалены напрямую.

Для этого мне нужно знать, имеется ли на диске корзина.

Ответы [ 2 ]

7 голосов
/ 11 октября 2011

Использовать FOF_WANTNUKEWARNING.

Отправить предупреждение, если файл был окончательно уничтожен во время операции удаления, а не переработан.Этот флаг частично перекрывает FOF_NOCONFIRMATION.

1 голос
/ 11 октября 2011

Я обнаружил функцию SHQueryRecycleBin, когда посмотрел на функции, экспортированные shell32.dll.

Если диск, указанный в 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;
    }
...