C# 获取光盘容量大小(空白光盘大小也可以获取到)

C# 获取光盘容量大小,正常的光盘可以使用windows api GetDiskFreeSpaceEx来获取

GetDiskFreeSpaceEx获取正常光盘 例子:

        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "GetDiskFreeSpaceEx")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, out ulong lpFreeBytesAvailable, out ulong lpTotalNumberOfBytes, out ulong lpTotalNumberOfFreeBytes);
 

            string strCdName = "H:";
            ulong a = 0;
            ulong b = 0;
            ulong c = 0;
           

            if (!GetDiskFreeSpaceEx(strCdName, out a, out b, out c))
            {
                //光盘信息获取失败
            }

或者通过WMI来获取

        public void GetCdSize(ref long free, ref long total)
        {
            string name = _cdName.Text.Replace("\\","");
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_LogicalDisk WHERE DriveType='5' and DeviceID='" + "H:'");
            foreach (ManagementObject mo in searcher.Get())
            {
                if (mo["FreeSpace"] != null) //可用
                {
                    free = Convert.ToInt64(mo["FreeSpace"]);
                }
                if (mo["Size"] != null)//总空间
                {
                    total = Convert.ToInt64(mo["Size"]) - free;
                }
            }
        }

通过GetDiskFreeSpaceEx和WMI只能获取正常光盘的容量大小,对于空白光盘获取容量大小是不能使用上述两种方法的

获取空白光盘或者正常使用光盘容量大小可以通过windows api Shell32.dll来获取。

下面是例子

    public class MyShell
    {
        public enum HRESULT : int
        {
            S_OK = 0,
            S_FALSE = 1,
            E_NOTIMPL = unchecked((int)0x80004001),
            E_NOINTERFACE = unchecked((int)0x80004002),
            E_POINTER = unchecked((int)0x80004003),
            E_FAIL = unchecked((int)0x80004005),
            E_UNEXPECTED = unchecked((int)0x8000FFFF),
            E_OUTOFMEMORY = unchecked((int)0x8007000E),
        }

        [DllImport("Shell32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern HRESULT SHILCreateFromPath([MarshalAs(UnmanagedType.LPWStr)] string pszPath, out IntPtr ppIdl, ref uint rgflnOut);

        [DllImport("Shell32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern HRESULT SHBindToParent(IntPtr pidl, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppv, out IntPtr ppidlLast);

        [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        [Guid("000214E6-0000-0000-C000-000000000046")]
        public interface IShellFolder
        {
            HRESULT ParseDisplayName(IntPtr hwnd,
                // IBindCtx pbc,
                IntPtr pbc,
                [MarshalAs(UnmanagedType.LPWStr)] string pszDisplayName, [In, Out] ref uint pchEaten, out IntPtr ppidl, [In, Out] ref SFGAO pdwAttributes);
            HRESULT EnumObjects(IntPtr hwnd, SHCONTF grfFlags, out IEnumIDList ppenumIDList);
            HRESULT BindToObject(IntPtr pidl,
                //IBindCtx pbc,
                IntPtr pbc,
                [In] ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppv);
            HRESULT BindToStorage(IntPtr pidl, IntPtr pbc, [In] ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppv);
            HRESULT CompareIDs(IntPtr lParam, IntPtr pidl1, IntPtr pidl2);
            HRESULT CreateViewObject(IntPtr hwndOwner, [In] ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppv);
            HRESULT GetAttributesOf(uint cidl, IntPtr apidl, [In, Out] ref SFGAO rgfInOut);
            HRESULT GetUIObjectOf(IntPtr hwndOwner, uint cidl, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.SysInt, SizeParamIndex = 1)] IntPtr apidl,
                [In] ref Guid riid, [In, Out] ref uint rgfReserved, [MarshalAs(UnmanagedType.Interface)] out object ppv);
            HRESULT GetDisplayNameOf(IntPtr pidl, SHGDNF uFlags, out STRRET pName);
            HRESULT SetNameOf(IntPtr hwnd, IntPtr pidl, [MarshalAs(UnmanagedType.LPWStr)] string pszName, SHGDNF uFlags, out IntPtr ppidlOut);
        }
        [Flags]
        public enum SHCONTF : ushort
        {
            SHCONTF_CHECKING_FOR_CHILDREN = 0x0010,
            SHCONTF_FOLDERS = 0x0020,
            SHCONTF_NONFOLDERS = 0x0040,
            SHCONTF_INCLUDEHIDDEN = 0x0080,
            SHCONTF_INIT_ON_FIRST_NEXT = 0x0100,
            SHCONTF_NETPRINTERSRCH = 0x0200,
            SHCONTF_SHAREABLE = 0x0400,
            SHCONTF_STORAGE = 0x0800,
            SHCONTF_NAVIGATION_ENUM = 0x1000,
            SHCONTF_FASTITEMS = 0x2000,
            SHCONTF_FLATLIST = 0x4000,
            SHCONTF_ENABLE_ASYNC = 0x8000
        }
        [Flags]
        public enum SFGAO : uint
        {
            CANCOPY = 0x00000001,
            CANMOVE = 0x00000002,
            CANLINK = 0x00000004,
            STORAGE = 0x00000008,
            CANRENAME = 0x00000010,
            CANDELETE = 0x00000020,
            HASPROPSHEET = 0x00000040,
            DROPTARGET = 0x00000100,
            CAPABILITYMASK = 0x00000177,
            ENCRYPTED = 0x00002000,
            ISSLOW = 0x00004000,
            GHOSTED = 0x00008000,
            LINK = 0x00010000,
            SHARE = 0x00020000,
            READONLY = 0x00040000,
            HIDDEN = 0x00080000,
            DISPLAYATTRMASK = 0x000FC000,
            STREAM = 0x00400000,
            STORAGEANCESTOR = 0x00800000,
            VALIDATE = 0x01000000,
            REMOVABLE = 0x02000000,
            COMPRESSED = 0x04000000,
            BROWSABLE = 0x08000000,
            FILESYSANCESTOR = 0x10000000,
            FOLDER = 0x20000000,
            FILESYSTEM = 0x40000000,
            HASSUBFOLDER = 0x80000000,
            CONTENTSMASK = 0x80000000,
            STORAGECAPMASK = 0x70C50008,
            PKEYSFGAOMASK = 0x81044000
        }
        [Flags]
        public enum SHGDNF : uint
        {
            SHGDN_NORMAL = 0,
            SHGDN_INFOLDER = 0x1,
            SHGDN_FOREDITING = 0x1000,
            SHGDN_FORADDRESSBAR = 0x4000,
            SHGDN_FORPARSING = 0x8000
        }
        [StructLayout(LayoutKind.Explicit, Size = 264)]

        public struct STRRET
        {
            [FieldOffset(0)]
            public uint uType;
            [FieldOffset(4)]
            public IntPtr pOleStr;
            [FieldOffset(4)]
            public uint uOffset;
            [FieldOffset(4)]
            public IntPtr cString;
        }
        [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        [Guid("000214F2-0000-0000-C000-000000000046")]

        public interface IEnumIDList
        {
            [PreserveSig()]
            HRESULT Next(uint celt, out IntPtr rgelt, out int pceltFetched);
            [PreserveSig()]
            HRESULT Skip(uint celt);
            void Reset();
            [return: MarshalAs(UnmanagedType.Interface)]
            IEnumIDList Clone();
        }
        [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        [Guid("93F2F68C-1D1B-11d3-A30E-00C04F79ABD1")]

        public interface IShellFolder2 : IShellFolder
        {
            #region IShellFolder overrides for COM/C# compatibility.
            [PreserveSig]
            new HRESULT ParseDisplayName(IntPtr hwnd, IntPtr pbc, [MarshalAs(UnmanagedType.LPWStr)] string pszDisplayName, [In, Out] ref uint pchEaten, out IntPtr ppidl, [In, Out] ref SFGAO pdwAttributes);
            [PreserveSig]
            new HRESULT EnumObjects(IntPtr hwnd, SHCONTF grfFlags, out IEnumIDList ppenumIDList);
            [PreserveSig]
            new HRESULT BindToObject(IntPtr pidl, IntPtr pbc, [In] ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppv);
            [PreserveSig]
            new HRESULT BindToStorage(IntPtr pidl, IntPtr pbc, [In] ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppv);
            [PreserveSig]
            new HRESULT CompareIDs(IntPtr lParam, IntPtr pidl1, IntPtr pidl2);
            [PreserveSig]
            new HRESULT CreateViewObject(IntPtr hwndOwner, [In] ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppv);
            [PreserveSig]
            new HRESULT GetAttributesOf(uint cidl, IntPtr apidl, [In, Out] ref SFGAO rgfInOut);
            [PreserveSig]
            new HRESULT GetUIObjectOf(IntPtr hwndOwner, uint cidl, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.SysInt, SizeParamIndex = 1)] IntPtr apidl,
                [In] ref Guid riid, [In, Out] ref uint rgfReserved, [MarshalAs(UnmanagedType.Interface)] out object ppv);
            [PreserveSig]
            new HRESULT GetDisplayNameOf(IntPtr pidl, SHGDNF uFlags, out STRRET pName);
            [PreserveSig]
            new HRESULT SetNameOf(IntPtr hwnd, IntPtr pidl, [MarshalAs(UnmanagedType.LPWStr)] string pszName, SHGDNF uFlags, out IntPtr ppidlOut);
            #endregion
            [PreserveSig]
            HRESULT GetDefaultSearchGUID(out Guid pguid);
            [PreserveSig]
            HRESULT EnumSearches([MarshalAs(UnmanagedType.Interface)] out object ppenum);
            [PreserveSig]
            HRESULT GetDefaultColumn(uint dwRes, out uint pSort, out uint pDisplay);
            [PreserveSig]
            HRESULT GetDefaultColumnState(uint iColumn, out SHCOLSTATEF pcsFlags);
            [PreserveSig]
            HRESULT GetDetailsEx(IntPtr pidl, ref PROPERTYKEY pscid, [MarshalAs(UnmanagedType.Struct)] out object pv);
            [PreserveSig]
            HRESULT GetDetailsOf(IntPtr pidl, uint iColumn, out SHELLDETAILS psd);
            [PreserveSig]
            HRESULT MapColumnToSCID(uint iColumn, out PROPERTYKEY pscid);
        }
        [Flags]
        public enum SHCOLSTATEF
        {
            SHCOLSTATE_DEFAULT = 0,
            SHCOLSTATE_TYPE_STR = 0x1,
            SHCOLSTATE_TYPE_INT = 0x2,
            SHCOLSTATE_TYPE_DATE = 0x3,
            SHCOLSTATE_ONBYDEFAULT = 0x10,
            SHCOLSTATE_SLOW = 0x20,
            SHCOLSTATE_EXTENDED = 0x40,
            SHCOLSTATE_SECONDARYUI = 0x80,
            SHCOLSTATE_HIDDEN = 0x100,
            SHCOLSTATE_PREFER_VARCMP = 0x200,
            SHCOLSTATE_PREFER_FMTCMP = 0x400,
            SHCOLSTATE_NOSORTBYFOLDERNESS = 0x800,
            SHCOLSTATE_VIEWONLY = 0x10000,
            SHCOLSTATE_BATCHREAD = 0x20000,
            SHCOLSTATE_NO_GROUPBY = 0x40000,
            SHCOLSTATE_FIXED_WIDTH = 0x1000,
            SHCOLSTATE_NODPISCALE = 0x2000,
            SHCOLSTATE_FIXED_RATIO = 0x4000,
        }
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

        public struct SHELLDETAILS
        {
            int fmt;
            int cxChar;
            STRRET str;
        }
        [StructLayout(LayoutKind.Sequential, Pack = 4)]

        public struct PROPERTYKEY
        {
            private readonly Guid _fmtid;
            private readonly uint _pid;
            public PROPERTYKEY(Guid fmtid, uint pid)
            {
                _fmtid = fmtid;
                _pid = pid;
            }
            public static readonly PROPERTYKEY PKEY_FreeSpace = new PROPERTYKEY(new Guid("9B174B35-40FF-11D2-A27E-00C04FC30871"), 2);
            public static readonly PROPERTYKEY PKEY_Capacity = new PROPERTYKEY(new Guid("9B174B35-40FF-11D2-A27E-00C04FC30871"), 3);
        }
    }

调用:

        public void GetSize()
        {
            IntPtr pidl;
            uint rgflnOut = 0;
            MyShell.HRESULT hr = MyShell.SHILCreateFromPath("H:", out pidl, ref rgflnOut);
            if (hr == MyShell.HRESULT.S_OK)
            {
                IntPtr pidlLast = IntPtr.Zero;
                object oShellFolder = null;
                hr = MyShell.SHBindToParent(pidl, typeof(MyShell.IShellFolder2).GUID, out oShellFolder, out pidlLast);
                if (hr == MyShell.HRESULT.S_OK)
                {
                    MyShell.IShellFolder2 psf2 = (MyShell.IShellFolder2)oShellFolder;
                    object vaFreeSpace;
                    MyShell.PROPERTYKEY pkFreeSpace = MyShell.PROPERTYKEY.PKEY_FreeSpace;
                    hr = psf2.GetDetailsEx(pidlLast, ref pkFreeSpace, out vaFreeSpace); //可用
                    object vaCapacity;
                    MyShell.PROPERTYKEY pkCapacity = MyShell.PROPERTYKEY.PKEY_Capacity;
                    hr = psf2.GetDetailsEx(pidlLast, ref pkCapacity, out vaCapacity);  //总
                }
            }
        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值