如何检测光驱里是否有光盘,请大家指点。谢谢!

解决方案 »

  1.   

    : sandsboy(沙滩男孩) ( 
    的意见应该可行。
      

  2.   

    using System;
    using System.Runtime.InteropServices; 
    using System.Collections;
    using System.Text;namespace CyberResource.Collection.WinVCD2_Browse.SystemFramework
    {
    /// <summary>
    /// GetCDRom 的摘要说明。
    /// </summary>
    public class GetCDRom
    {
    [DllImport("kernel32.dll",CharSet = CharSet.Ansi)]
    internal static extern uint GetLogicalDriveStrings(
    uint nBufferLength, // size of buffer
    IntPtr lpBuffer // address of buffer for drive strings
    );
    [DllImport("kernel32.dll",CharSet = CharSet.Ansi)]
    internal static extern uint GetDriveType(
    string lpRootPathName // address of root path
    );
    public ArrayList GetCD()
    {
    //uint DRIVE_UNKNOWN = 0;
    //uint DRIVE_NO_ROOT_DIR = 1;
    //uint DRIVE_REMOVABLE = 2;
    //uint DRIVE_FIXED = 3;
    //uint DRIVE_REMOTE = 4;
    uint DRIVE_CDROM = 5;
    //uint DRIVE_RAMDISK = 6;
    uint bufSize = GetLogicalDriveStrings(0,IntPtr.Zero);
    IntPtr ptr = Marshal.AllocHGlobal((int)bufSize);
    bufSize = GetLogicalDriveStrings(bufSize,ptr);
    string str = Marshal.PtrToStringAnsi(ptr,(int)bufSize);
    Marshal.FreeHGlobal(ptr);
    StringBuilder sb = new StringBuilder();
    string[] strs = str.Split(new char[]{(char)0});
    ArrayList lstCD = new ArrayList();
    uint type;
    for(int i = 0; i < strs.Length; ++i)
    {
    if(strs[i] != null)
    {
    type = GetDriveType(strs[i]);
    if(type == DRIVE_CDROM)
    lstCD.Add(strs[i]);
    }
    }
    return lstCD;
    // for(int i = 0; i < lstCD.Count; ++i)
    // Console.WriteLine("CDRom is {0}",lstCD[i].ToString());
    }
    }
    }取得光驱的代码,别人给的
    如何检测光驱中是否有盘,还没实现呢,
      

  3.   

    我是这样取判断是否有盘的
    private void button1_Click(object sender, System.EventArgs e)
    {
    GetCDRom instanceGetCDRom = new GetCDRom();
    for(int i=0; i<instanceGetCDRom.GetCD().Count; ++i)
    {
    label1.Text = "";
    label1.Text += instanceGetCDRom.GetCD()[i].ToString(); 
    try
    {
    if(File.Exists(instanceGetCDRom.GetCD()[i]+@"database\vcd_software.mdb"))
    {
    MessageBox.Show("数据库文件存在","助手提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
    this.label2.Text = instanceGetCDRom.GetCD()[i].ToString();
    break;
    }
    else
    {
    MessageBox.Show("请确认您已经放入了正确的光盘!","助手提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
    }
    }
    catch
    {
    MessageBox.Show("无法读取光驱中的文件,请检查后再执行相关操作","助手提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
    }
    } }
      

  4.   

    using System.Management;
    public string GetVolumeSerial(string strDriveLetter)
            {
            if( strDriveLetter=="" || strDriveLetter==null)
             strDriveLetter="C";
            ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"" + strDriveLetter +":\"");
            disk.Get();
            return disk["Size"].ToString();
            }strDriveLetter 为 C ,D 等,你自己设置
    返回的是 驱动器的 容量,
    判断驱动你的光驱的容量是否 大于 0 ,就可以了,
    剩下的你自己改吧,祝你好运
      

  5.   

    一下是一个比较完整的代码,已经测试通过了 (Win2003 + #Develop),第一次写这样的代码,写的不是很好using System;
    using System.Runtime.InteropServices; 
    using System.Collections;
    using System.Text;
    using System.Management;
    namespace GetCDRom
    {
    class MainClass
    {
    [DllImport("kernel32.dll",CharSet = CharSet.Ansi)]
    internal static extern uint GetLogicalDriveStrings(
    uint nBufferLength, // size of buffer
    IntPtr lpBuffer // address of buffer for drive strings
    );
    [DllImport("kernel32.dll",CharSet = CharSet.Ansi)]
    internal static extern uint GetDriveType(
    string lpRootPathName // address of root path
    );

    public static void Main(string[] args)
    {
    Console.WriteLine("Hello World!");

    MainClass myClass = new MainClass();
    for(int i=0;i < myClass.GetCDRom().Count; ++i)
    Console.WriteLine(myClass.GetCDRom()[i]);

    for(int i=0;i < myClass.GetCDRom().Count; ++i)
    {
    try
    {
    int intTmp = myClass.GetVolumeSize(myClass.GetCDRom()[i].ToString().Replace("\\",""));
    if(intTmp > 0)
    {
    Console.WriteLine("光驱{0}中有光盘",myClass.GetCDRom()[i]);
    }
    }
    catch
    {
    Console.WriteLine("发生异常");
    }
    }
    Console.WriteLine(myClass.GetVolumeSize("H:").ToString());
    }
    public ArrayList GetCDRom()
    {
    //uint DRIVE_UNKNOWN = 0;
    //uint DRIVE_NO_ROOT_DIR = 1;
    //uint DRIVE_REMOVABLE = 2;
    //uint DRIVE_FIXED = 3;
    //uint DRIVE_REMOTE = 4;
    uint DRIVE_CDROM = 5;
    //uint DRIVE_RAMDISK = 6;
    uint bufSize = GetLogicalDriveStrings(0,IntPtr.Zero);
    IntPtr ptr = Marshal.AllocHGlobal((int)bufSize);
    bufSize = GetLogicalDriveStrings(bufSize,ptr);
    string str = Marshal.PtrToStringAnsi(ptr,(int)bufSize);
    Marshal.FreeHGlobal(ptr);
    StringBuilder sb = new StringBuilder();
    string[] strs = str.Split(new char[]{(char)0});
    ArrayList lstCD = new ArrayList();
    uint type;
    for(int i = 0; i < strs.Length; ++i)
    {
    if(strs[i] != null)
    {
    type = GetDriveType(strs[i]);
    if(type == DRIVE_CDROM)
    lstCD.Add(strs[i]);
    }
    }
    return lstCD;
    }

    public int GetVolumeSize(string strDriveLetter)
            {
            if( strDriveLetter=="" || strDriveLetter==null)
             strDriveLetter="C";
            ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"" + strDriveLetter +"\"");
            disk.Get();
            return Convert.ToInt32(disk["Size"].ToString());
            } 
    }
    }