How to get the space size of blank disc in CD-ROM in C#, such as total capacity size, free space size, used space size

Afon.zhang 396 Reputation points
2022-02-09T01:22:16.59+00:00

https://learn.microsoft.com/en-us/answers/questions/688684/how-to-get-the-information-of-the-cd-in-the-cd-rom.html
In this post, I asked a question, but for a blank disc, the amount of space obtained is 0

Windows development | Windows API - Win32
0 comments No comments
{count} votes

Accepted answer
  1. Castorix31 90,686 Reputation points
    2022-02-09T03:20:52.307+00:00

    I tested with the Shell and I get same result as Explorer with a blank disk :

                IntPtr pidl;
                uint rgflnOut = 0;
                HRESULT hr = SHILCreateFromPath("F:", out pidl, ref rgflnOut);
                if (hr == HRESULT.S_OK)
                {
                    IntPtr pidlLast = IntPtr.Zero;
                    object oShellFolder = null;
                    hr = SHBindToParent(pidl, typeof(IShellFolder2).GUID, out oShellFolder, out pidlLast);
                    if (hr == HRESULT.S_OK)
                    {
                        IShellFolder2 psf2 = (IShellFolder2)oShellFolder;
                        object vaFreeSpace;
                        PROPERTYKEY pkFreeSpace = PROPERTYKEY.PKEY_FreeSpace;
                        hr = psf2.GetDetailsEx(pidlLast, ref pkFreeSpace, out vaFreeSpace);
                        object vaCapacity;
                        PROPERTYKEY pkCapacity = PROPERTYKEY.PKEY_Capacity;
                        hr = psf2.GetDetailsEx(pidlLast, ref pkCapacity, out vaCapacity);
                        MessageBox.Show(string.Format("Free space = {0}\r\nCapacity = {1}\r\n", vaFreeSpace, vaCapacity), "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
    

    Declarations :

        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);
        }
    
    1 person found this answer helpful.

1 additional answer

Sort by: Most helpful
  1. Xiaopo Yang - MSFT 12,731 Reputation points Microsoft External Staff
    2022-02-09T02:41:17.367+00:00

    Perhaps Image Mastering API is competent. Have a look at Available space on blank dvd / blu-ray discs (IMAPI) which involves a sample.

    1 person found this answer helpful.
    0 comments No comments

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.