Как определить, является ли оптический привод (а не диск) приводом CD или DVD?

Как указано в заголовке, я пытаюсь определить, является ли привод DVD приводом или приводом компакт-дисков. Опять же, я не спрашиваю о носителе, я спрашиваю о самом диске... объекте, на который указывает класс DriveInfo.

Я думаю, что класса DriveInfo недостаточно, и вместо этого мне придется получить экземпляр Win32_DiskDrive из WMI и покопаться там. Проблема в том, что все образцы, которые я нашел до сих пор, говорят об обнаруженных носителях, но DVD-привод может использовать CD-носители, поэтому этого недостаточно. Кроме того, код должен работать независимо от того, присутствует носитель или нет.


person Mark A. Donohoe    schedule 27.09.2015    source источник
comment
Да, я сделал. Я хотел знать, есть ли что-то больше за этим вопросом, потому что привод DVD всегда будет сам CD-ROM, что немного усложняет задачу.   -  person Yuval Itzchakov    schedule 27.09.2015
comment
DVD-привод не будет CD-приводом. Он может читать компакт-диск, но это DVD-привод. Я показываю диски в своем приложении. Я хочу отображать DVD-приводы отдельно от CD-приводов. Вот почему я спрашиваю, является ли оптический привод DVD-приводом или только CD-приводом.   -  person Mark A. Donohoe    schedule 27.09.2015
comment
Эй... извините, если это получилось язвительно. Не хотел. Просто я конкретно сказал в вопросе, что я искал и чего я не искал, а когда вы спросили, на что я уже ответил, это меня неправильно настроило. Извини за это.   -  person Mark A. Donohoe    schedule 27.09.2015
comment
Ничего страшного, просто пытаюсь помочь :)   -  person Yuval Itzchakov    schedule 27.09.2015
comment
Кстати, госпожа видит его того же типа (i.imgur.com/2Smgs2u.png)   -  person Royi Namir    schedule 27.09.2015
comment
На самом деле, нет. Там он отображается как таковой, но в самом окне проводника он говорит «DVD-плеер». По крайней мере, в моей системе. Это в той же семье, и, вероятно, поэтому вы это видите, но я искал конкретную разницу, на которую, похоже, может указать ответ ниже.   -  person Mark A. Donohoe    schedule 27.09.2015


Ответы (1)


Вы можете получить его от WMI. Класс Win32_CDROMDrive.

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT MediaType FROM Win32_CDROMDrive");
ManagementObjectCollection collection = searcher.Get();
foreach (ManagementBaseObject obj in collection)
{
    MessageBox.Show(obj["MediaType"].ToString());
}

Это будет проблемой, если вам нужно знать о BDRom и т. д. Я рекомендую использовать инструменты NeroCmd вместо WMI.

Также вы можете попробовать посмотреть здесь. Речь идет о записи, но там вы можете найти Поддерживаемые носители дисков. Если он поддерживает Blu-Ray, то явно не CD-ROM :)

Я пытался получить только важные части. Здесь мы используем IMAPI2 API для получения функций устройства (CD/DVD/BD/HDDVD-READ). Я знаю, что есть приводы COMBO, которые поддерживают BD и HDDVD, но я не показываю это в коде.

//
// Determine the current recording devices
//
MsftDiscMaster2 discMaster = null;
try
{
    discMaster = new MsftDiscMaster2();

    if (!discMaster.IsSupportedEnvironment)
        return;

    // Get drives
    foreach (string uniqueRecorderId in discMaster)
    {
        IDiscRecorder2 discRecorder2 = new MsftDiscRecorder2();
        discRecorder2.InitializeDiscRecorder(uniqueRecorderId);
        // Show device mount drive and determine type
        Console.WriteLine("Path: {0} Type: {1}", discRecorder2.VolumePathNames[0], CheckType(discRecorder2));
    }
}
catch (COMException ex)
{
    Console.WriteLine("Error:{0} - Please install IMAPI2", ex.ErrorCode);
}
finally
{
    if (discMaster != null)
        Marshal.ReleaseComObject(discMaster);
}

Магия ^_^

// Determine type
static string CheckType(IDiscRecorder2 disc)
{
    var features = disc.SupportedFeaturePages.Select(a => (IMAPI_FEATURE_PAGE_TYPE)a).ToArray();
    if (features.Contains(IMAPI_FEATURE_PAGE_TYPE.IMAPI_FEATURE_PAGE_TYPE_HD_DVD_READ))
        return "HD-DVD-ROM";
    if (features.Contains(IMAPI_FEATURE_PAGE_TYPE.IMAPI_FEATURE_PAGE_TYPE_BD_READ))
        return "BD-ROM";
    if (features.Contains(IMAPI_FEATURE_PAGE_TYPE.IMAPI_FEATURE_PAGE_TYPE_DVD_READ))
        return "DVD-ROM";
    if (features.Contains(IMAPI_FEATURE_PAGE_TYPE.IMAPI_FEATURE_PAGE_TYPE_CD_READ))
        return "CD-ROM";
    return "Unknown";
}

Взаимодействие...

/// <summary>
/// Microsoft IMAPIv2 Disc Master
/// </summary>
[ComImport]
[Guid("27354130-7F64-5B0F-8F00-5D77AFBE261E")]
[CoClass(typeof(MsftDiscMaster2Class))]
public interface MsftDiscMaster2 : IDiscMaster2 //, DiscMaster2_Event
{
}

[ComImport, ComSourceInterfaces("DDiscMaster2Events\0")]
[TypeLibType(TypeLibTypeFlags.FCanCreate)]
[Guid("2735412E-7F64-5B0F-8F00-5D77AFBE261E")]
[ClassInterface(ClassInterfaceType.None)]
public class MsftDiscMaster2Class
{
}

[ComImport]
[CoClass(typeof(MsftDiscRecorder2Class))]
[Guid("27354133-7F64-5B0F-8F00-5D77AFBE261E")]
public interface MsftDiscRecorder2 : IDiscRecorder2
{
}


[ComImport]
[Guid("2735412D-7F64-5B0F-8F00-5D77AFBE261E")]
[TypeLibType(TypeLibTypeFlags.FCanCreate)]
[ClassInterface(ClassInterfaceType.None)]
public class MsftDiscRecorder2Class
{
}

/// <summary>
/// IDiscMaster2 is used to get an enumerator for the set of CD/DVD (optical) devices on the system
/// </summary>
[ComImport]
[Guid("27354130-7F64-5B0F-8F00-5D77AFBE261E")]
[TypeLibType(TypeLibTypeFlags.FDual | TypeLibTypeFlags.FDispatchable | TypeLibTypeFlags.FNonExtensible)]
public interface IDiscMaster2
{
    // Enumerates the list of CD/DVD devices on the system (VT_BSTR)
    [DispId(-4), TypeLibFunc((short)0x41)]
    IEnumerator GetEnumerator();

    // Gets a single recorder's ID (ZERO BASED INDEX)
    [DispId(0)]
    string this[int index] { get; }

    // The current number of recorders in the system.
    [DispId(1)]
    int Count { get; }

    // Whether IMAPI is running in an environment with optical devices and permission to access them.
    [DispId(2)]
    bool IsSupportedEnvironment { get; }
}

/// <summary>
///  Represents a single CD/DVD type device, and enables many common operations via a simplified API.
/// </summary>
[ComImport]
[TypeLibType(TypeLibTypeFlags.FDual | TypeLibTypeFlags.FDispatchable | TypeLibTypeFlags.FNonExtensible)]
[Guid("27354133-7F64-5B0F-8F00-5D77AFBE261E")]
public interface IDiscRecorder2
{
    // Ejects the media (if any) and opens the tray
    [DispId(0x100)]
    void EjectMedia();

    // Close the media tray and load any media in the tray.
    [DispId(0x101)]
    void CloseTray();

    // Acquires exclusive access to device.  May be called multiple times.
    [DispId(0x102)]
    void AcquireExclusiveAccess(bool force, string clientName);

    // Releases exclusive access to device.  Call once per AcquireExclusiveAccess().
    [DispId(0x103)]
    void ReleaseExclusiveAccess();

    // Disables Media Change Notification (MCN).
    [DispId(260)]
    void DisableMcn();

    // Re-enables Media Change Notification after a call to DisableMcn()
    [DispId(0x105)]
    void EnableMcn();

    // Initialize the recorder, opening a handle to the specified recorder.
    [DispId(0x106)]
    void InitializeDiscRecorder(string recorderUniqueId);

    // The unique ID used to initialize the recorder.
    [DispId(0)]
    string ActiveDiscRecorder { get; }

    // The vendor ID in the device's INQUIRY data.
    [DispId(0x201)]
    string VendorId { get; }

    // The Product ID in the device's INQUIRY data.
    [DispId(0x202)]
    string ProductId { get; }

    // The Product Revision in the device's INQUIRY data.
    [DispId(0x203)]
    string ProductRevision { get; }

    // Get the unique volume name (this is not a drive letter).
    [DispId(0x204)]
    string VolumeName { get; }

    // Drive letters and NTFS mount points to access the recorder.
    [DispId(0x205)]
    object[] VolumePathNames {[DispId(0x205)] get; }

    // One of the volume names associated with the recorder.
    [DispId(0x206)]
    bool DeviceCanLoadMedia {[DispId(0x206)] get; }

    // Gets the legacy 'device number' associated with the recorder.  This number is not guaranteed to be static.
    [DispId(0x207)]
    int LegacyDeviceNumber {[DispId(0x207)] get; }

    // Gets a list of all feature pages supported by the device
    [DispId(520)]
    object[] SupportedFeaturePages {[DispId(520)] get; }

    // Gets a list of all feature pages with 'current' bit set to true
    [DispId(0x209)]
    object[] CurrentFeaturePages {[DispId(0x209)] get; }

    // Gets a list of all profiles supported by the device
    [DispId(0x20a)]
    object[] SupportedProfiles {[DispId(0x20a)] get; }

    // Gets a list of all profiles with 'currentP' bit set to true
    [DispId(0x20b)]
    object[] CurrentProfiles {[DispId(0x20b)] get; }

    // Gets a list of all MODE PAGES supported by the device
    [DispId(0x20c)]
    object[] SupportedModePages {[DispId(0x20c)] get; }

    // Queries the device to determine who, if anyone, has acquired exclusive access
    [DispId(0x20d)]
    string ExclusiveAccessOwner {[DispId(0x20d)] get; }
}

public enum IMAPI_FEATURE_PAGE_TYPE
{
    IMAPI_FEATURE_PAGE_TYPE_PROFILE_LIST = 0,
    IMAPI_FEATURE_PAGE_TYPE_CORE = 1,
    IMAPI_FEATURE_PAGE_TYPE_MORPHING = 2,
    IMAPI_FEATURE_PAGE_TYPE_REMOVABLE_MEDIUM = 3,
    IMAPI_FEATURE_PAGE_TYPE_WRITE_PROTECT = 4,
    IMAPI_FEATURE_PAGE_TYPE_RANDOMLY_READABLE = 0x10,
    IMAPI_FEATURE_PAGE_TYPE_CD_MULTIREAD = 0x1d,
    IMAPI_FEATURE_PAGE_TYPE_CD_READ = 0x1e,
    IMAPI_FEATURE_PAGE_TYPE_DVD_READ = 0x1f,
    IMAPI_FEATURE_PAGE_TYPE_RANDOMLY_WRITABLE = 0x20,
    IMAPI_FEATURE_PAGE_TYPE_INCREMENTAL_STREAMING_WRITABLE = 0x21,
    IMAPI_FEATURE_PAGE_TYPE_SECTOR_ERASABLE = 0x22,
    IMAPI_FEATURE_PAGE_TYPE_FORMATTABLE = 0x23,
    IMAPI_FEATURE_PAGE_TYPE_HARDWARE_DEFECT_MANAGEMENT = 0x24,
    IMAPI_FEATURE_PAGE_TYPE_WRITE_ONCE = 0x25,
    IMAPI_FEATURE_PAGE_TYPE_RESTRICTED_OVERWRITE = 0x26,
    IMAPI_FEATURE_PAGE_TYPE_CDRW_CAV_WRITE = 0x27,
    IMAPI_FEATURE_PAGE_TYPE_MRW = 0x28,
    IMAPI_FEATURE_PAGE_TYPE_ENHANCED_DEFECT_REPORTING = 0x29,
    IMAPI_FEATURE_PAGE_TYPE_DVD_PLUS_RW = 0x2a,
    IMAPI_FEATURE_PAGE_TYPE_DVD_PLUS_R = 0x2b,
    IMAPI_FEATURE_PAGE_TYPE_RIGID_RESTRICTED_OVERWRITE = 0x2c,
    IMAPI_FEATURE_PAGE_TYPE_CD_TRACK_AT_ONCE = 0x2d,
    IMAPI_FEATURE_PAGE_TYPE_CD_MASTERING = 0x2e,
    IMAPI_FEATURE_PAGE_TYPE_DVD_DASH_WRITE = 0x2f,
    IMAPI_FEATURE_PAGE_TYPE_DOUBLE_DENSITY_CD_READ = 0x30,
    IMAPI_FEATURE_PAGE_TYPE_DOUBLE_DENSITY_CD_R_WRITE = 0x31,
    IMAPI_FEATURE_PAGE_TYPE_DOUBLE_DENSITY_CD_RW_WRITE = 0x32,
    IMAPI_FEATURE_PAGE_TYPE_LAYER_JUMP_RECORDING = 0x33,
    IMAPI_FEATURE_PAGE_TYPE_CD_RW_MEDIA_WRITE_SUPPORT = 0x37,
    IMAPI_FEATURE_PAGE_TYPE_BD_PSEUDO_OVERWRITE = 0x38,
    IMAPI_FEATURE_PAGE_TYPE_DVD_PLUS_R_DUAL_LAYER = 0x3b,
    IMAPI_FEATURE_PAGE_TYPE_BD_READ = 0x40,
    IMAPI_FEATURE_PAGE_TYPE_BD_WRITE = 0x41,
    IMAPI_FEATURE_PAGE_TYPE_HD_DVD_READ = 0x50,
    IMAPI_FEATURE_PAGE_TYPE_HD_DVD_WRITE = 0x51,
    IMAPI_FEATURE_PAGE_TYPE_POWER_MANAGEMENT = 0x100,
    IMAPI_FEATURE_PAGE_TYPE_SMART = 0x101,
    IMAPI_FEATURE_PAGE_TYPE_EMBEDDED_CHANGER = 0x102,
    IMAPI_FEATURE_PAGE_TYPE_CD_ANALOG_PLAY = 0x103,
    IMAPI_FEATURE_PAGE_TYPE_MICROCODE_UPDATE = 0x104,
    IMAPI_FEATURE_PAGE_TYPE_TIMEOUT = 0x105,
    IMAPI_FEATURE_PAGE_TYPE_DVD_CSS = 0x106,
    IMAPI_FEATURE_PAGE_TYPE_REAL_TIME_STREAMING = 0x107,
    IMAPI_FEATURE_PAGE_TYPE_LOGICAL_UNIT_SERIAL_NUMBER = 0x108,
    IMAPI_FEATURE_PAGE_TYPE_MEDIA_SERIAL_NUMBER = 0x109,
    IMAPI_FEATURE_PAGE_TYPE_DISC_CONTROL_BLOCKS = 0x10a,
    IMAPI_FEATURE_PAGE_TYPE_DVD_CPRM = 0x10b,
    IMAPI_FEATURE_PAGE_TYPE_FIRMWARE_INFORMATION = 0x10c,
    IMAPI_FEATURE_PAGE_TYPE_AACS = 0x10d,
    IMAPI_FEATURE_PAGE_TYPE_VCPS = 0x110
}

Согласно MSDN, IMAPI_FEATURE_PAGE_TYPE может содержать не только эти значения, так что будьте осторожны.

person Spawn    schedule 27.09.2015
comment
Почему приводы BD-ROM могут вызывать проблемы? Кроме того, это должно быть что-то, что установлено с платформой .NET 4.6, поэтому я не уверен насчет NeroCmd (я так понимаю, это как-то связано с программным обеспечением для дисков Nero, нет?) - person Mark A. Donohoe; 27.09.2015
comment
@MarqueIV, для Microsoft нет разницы между BDRom и DVD-ROM, для моего Blu-Ray с поддержкой записи написано DVD Writer - person Spawn; 27.09.2015
comment
Запустил этот код, и он вернул «НЕИЗВЕСТНО» для MediaType. Вы уверены, что это проверяет привод без диска? Опять же, я запрашиваю аппаратное обеспечение, а не носитель. - person Mark A. Donohoe; 27.09.2015
comment
Это не для СМИ. У вас один оптический привод? Разве это не виртуально? - person Spawn; 27.09.2015
comment
Они могут быть виртуальными. Это также может быть физическое оборудование, виртуализированное в виртуальную машину, такую ​​как Parallels на Mac или VMWare на ПК. Дело в том, что он всегда должен работать независимо. Все они правильно отображаются как объекты DriveInfo в C#. Я просто не могу сказать, в чем разница между приводами CD и DVD, которую нам нужно знать. - person Mark A. Donohoe; 27.09.2015
comment
@MarqueIV Я обновил пост, это не идеальное решение, но могу помочь. - person Spawn; 27.09.2015
comment
Это много, чтобы прочитать. Я должен буду проверить это утром. Однако, если вы сможете извлечь информацию, которую я ищу, я отмечу вашу как ответ. (Мне не нравится отмечать внешние ссылки как ответ, потому что они всегда могут стать мертвыми/измениться, что сделает ответ бесполезным.) - person Mark A. Donohoe; 27.09.2015