存在チェック ドライブにC#でごみ箱があるかどうかを検出するにはどうすればよいですか?




getlogicaldrives c# (2)

私はshell32.dllによってエクスポートされた関数を見て、SHQueryRecycleBinという関数を見つけました。

pszRootPathで指定されたドライブにごみ箱がある場合、関数は0を返し、それ以外の場合は-2147467259を返します。

この関数をPInvokeで使うつもりです。

PInvokeコードを作成するために、P / Invoke Interop Assistantを使用しました。

私の関数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;
    }

私はファイルをごみ箱に移動するためにFOF_ALLOWUNDOとSHFileOperationを使用するアプリケーションを持っています。

リムーバブルドライブにはごみ箱がありません。 この場合、SHFileOperationはファイルを直接削除します。 私は、ファイルが直接削除されることをユーザーに警告したいと思います。

これを行うには、ドライブにごみ箱があるかどうかを知る必要があります。


FOF_WANTNUKEWARNINGを使用します。

ファイルがリサイクルされずに削除操作中に永久に破棄されている場合は、警告を送信します。 このフラグは、FOF_NOCONFIRMATIONを部分的にオーバーライドします。





recycle-bin