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); //总
}
}
}