检测光盘是否放置在DVD驱动器中

7

有没有一种简单的方法来检测 DVD 驱动器中是否插入了光盘?我不关心是什么类型的光盘(CD、DVD 还是蓝光)。


4
如何检测特定驱动器是否为硬盘? - Musa
4
有一个简单的方式可以找到你所寻找的答案,它称为搜索。仅在这个网站上就有大量提出的解决方案。 - TheZ
@Musa - 那个问题不是我要问的。那个问题是关于检测驱动器是光驱还是硬盘驱动器的。与我所问的无关。 - Icemanind
2个回答

15

使用 WMI 检测 CD/DVD 驱动器中的磁盘:

foreach (var drive in DriveInfo.GetDrives()
                               .Where(d => d.DriveType == DriveType.CDRom))  
MessageBox.Show(drive.Name + " " + drive.IsReady.ToString()); 

来自这里

DriveType枚举可以帮助您确定什么样的光盘:

  • CDRom:驱动器是光学磁盘设备,如CD或DVD-ROM。
  • Fixed:驱动器是固定磁盘。
  • Network:驱动器是网络驱动器。
  • NoRootDirectory:驱动器没有根目录。
  • Ram:驱动器是RAM磁盘。
  • Removable:驱动器是可移动存储设备,如软盘驱动器或USB闪存驱动器。
  • Unknown:驱动器类型未知。

若要查看CD/DVD/蓝光光盘的类型,请参见IMAPI_MEDIA_PHYSICAL_TYPE枚举

  • 未知
  • CD-ROM
  • CD-R
  • CD-RW
  • DVD-ROM
  • DVD-RAM
  • DVD+R
  • DVD+RW
  • DVD+R双层
  • DVD-R
  • DVD-RW
  • DVD-R双层
  • 磁盘
  • DVD+RW双层
  • HDDVD-ROM
  • HDDVD-R
  • HDDVD-RAM
  • BD-ROM
  • BD-R
  • BD-RE
  • 最大值

你的代码可能像这样:

public bool IsDiscAvailable(int driveNumber)
{
    MsftDiscMaster2Class discMaster = new MsftDiscMaster2Class();
    string id = discMaster[driveNumber];

    MsftDiscRecorder2Class recorder = new MsftDiscRecorder2Class();
    recorder.InitializeDiscRecorder(id);

    MsftDiscFormat2DataClass dataWriter = new MsftDiscFormat2DataClass();
    if (dataWriter.IsRecorderSupported(recorder))
    {
        dataWriter.Recorder = recorder;
    }
    else
    {
        Console.WriteLine("Recorder not supported");
        return false;
    }
    if (dataWriter.IsCurrentMediaSupported(recorder))
    {
        var media = dataWriter.CurrentPhysicalMediaType;
        if (media == IMAPI_MEDIA_PHYSICAL_TYPE.IMAPI_MEDIA_TYPE_UNKNOWN)
        {
            Console.WriteLine("Unknown media or no disc");
        }
        else
        {
            Console.WriteLine("Found disc type {0}", media);
            return true;
        }
    }
    else
    {
        Console.WriteLine("Disc absent or invalid.");
    }
    return false;
}

来自这里


1

如何检测CD-ROM是否已加载到CD-ROM驱动器中

来自上述链接

using System;
using System.Management;

class Application
{
    public static void Main()
    {
        SelectQuery query = 
            new SelectQuery( "select * from win32_logicaldisk where drivetype=5" );
        ManagementObjectSearcher searcher = 
            new ManagementObjectSearcher(query);

        foreach( ManagementObject mo in searcher.Get() )
        {
            // If both properties are null I suppose there's no CD
            if(( mo["volumename"] != null) || (mo["volumeserialnumber"] != null))
            {
                Console.WriteLine("CD is named: {0}", mo["volumename"]);
                Console.WriteLine("CD Serial Number: {0}", mo["volumeserialnumber"]);
            }
            else
            {
                Console.WriteLine("No CD in Unit");
            }
        }

        // Here to stop app from closing
        Console.WriteLine("\nPress Return to exit.");
        Console.Read();
    }
}

4
由于链接会失效,仅提供链接并不构成一个好的答案。http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers/8259#8259 - spender
你说得没错,但是既然已经有了一个东西,为什么不重复利用它呢? - Waqar Janjua
我已经发布了代码,那么就没有必要再投反对票了。 - Waqar Janjua
1
是的,踩票者很愚蠢。(也因为他们会失去声望)我会帮你恢复到0。 - Bitterblue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接