C# 实现刻录光盘功能

这篇博客介绍了如何在C#中实现光盘刻录功能,分别探讨了使用IMAPI2和调用Nero SDK的两种方法。作者在WIN7环境下成功使用了IMAPI2,但在XP系统上遇到问题。此外,还分享了使用Nero SDK时需要注意的版本和.NET框架兼容性问题,并提供了自封装的简单刻录类库的代码链接。
摘要由CSDN通过智能技术生成

最近公司提出一个需求,要把公司系统的图像刻录成光盘(公司系统是医院放射科系统,很多放射科的图像)

 

查看了很多资料发现有两个比较可靠

1:使用IMAPI2,进行文件的光盘刻录,具体实例可以参照以下链接:

 C#实现方式:

Burning and Erasing CD/DVD Media with C# and IMAPI2

地址:http://www.codeproject.com/Articles/24544/Burning-and-Erasing-CD-DVD-Blu-ray-Media-with-C-an

C++实现方式:

Burning CD/DVD Media with the Image Mastering API Version 2.0 (IMAPI2)

地址:http://www.codeproject.com/Articles/22538/Burning-CD-DVD-Media-with-the-Image-Mastering-API

 

我用的C#的版本,经过测试 在WIN7下好用,xp 下不好用, 虽然很多人说xp sp3补丁可以,但是我还是失败了,公司的系统要求Xp可以使用

而且有个奇怪的问题,我自定义的项目就没有进度条的事件,下载老外的源码就有,好奇怪

郁闷呀..

 

2:C#调用Nero SDK进行

参考资料:1.http://blog.sina.com.cn/s/blog_962aaf5d01012vow.html

      2.http://blog.csdn.net/laibeikele/article/details/2500185

这两位写的都很完全,我只是把它收集补充了一下

首先是

SDK的版本: 采用NeroSDK-1.08版本,

Nero版本: 你的电脑需要安装Nero, 应该是必须要Nero7, 我安装了8不好用,只有安装7才好用

开发注意:.net版本应该是1.0到3.5之间.4.0,4.5编译不了,而且项目的目标平台必须是x86 其他的会报错

 

基于Nero SDK有我自己的一个简单的封装,帖出来给大家分享一下

项目结构

 

系统定义部分委托:

 

    /// <summary>
    /// 显示时间进度
    /// </summary>
    /// <param name="time"></param>
    public delegate void ShowTimeProcessDelegate(string time);

    /// <summary>
    /// 显示进度
    /// </summary>
    /// <param name="percentProgress"></param>
    public delegate void ShowBrushLogLineDelegate(string value);
  

    /// <summary>
    /// 显示进度
    /// </summary>
    /// <param name="percentProgress"></param>
    public delegate void ShowBrushProcessDelegate(ProcessEntity percentEvent);

    /// <summary>
    /// 刻录错误
    /// </summary>
    /// <param name="error"></param>
    public delegate void BurshErrorDelegate(Exception ex);


    /// <summary>
    /// 刻录成功
    /// </summary>
    /// <param name="value"></param>
    public delegate void BrushSuccessDelegate(string value);

    /// <summary>
    /// 显示光盘信息
    /// </summary>
    /// <returns></returns>
    public delegate  void  ShowDiscInfoDelegate(DiscInfoEntity disc);

    /// <summary>
    /// 获取所以刻录信息
    /// </summary>
    /// <param name="collection"></param>
    public delegate void GetSpeedEntityCollectionDelegate(SpeedEntityCollection collection);

 

 获取光盘信息方法

 /// <summary>
    /// 光盘信息帮助类
    /// </summary>
    class DiscHelper
    {

        private Nero m_nero;
        private NeroDrive m_drive;
        internal event ShowDiscInfoDelegate ShowDisc;


        public DiscHelper(Nero nero, NeroDrive drive)
        {
            this.m_nero = nero;
            this.m_drive = drive;
        }

        /// <summary>
        /// 获取光盘容量
        /// </summary>
        /// <param name="driveInfo">驱动器信息</param>
        /// <returns></returns>
        public void GetDriveInfoSize()
        {
            if (m_drive != null)
            {
                m_drive.OnDoneCDInfo += drive_OnDoneCDInfo;
            }
            RefreshDiscInfo();
        }

        private void RefreshDiscInfo()
        {
            if (m_drive != null)
            {
                m_drive.CDInfo(NERO_CDINFO_FLAGS.NERO_READ_CD_TEXT);
            }
        }

        /// <summary>
        /// 异步触发信息类
        /// </summary>
        /// <param name="pCDInfo"></param>
        private void drive_OnDoneCDInfo(INeroCDInfo pCDInfo)
        {
            
            m_drive.OnDoneCDInfo -= drive_OnDoneCDInfo;
            DisplayDiscInfo((NeroCDInfo)pCDInfo);
        }


        /// <summary>
        /// 格式化光盘信息实体类
        /// </summary>
        /// <param name="cdinfo"></param>
        private void DisplayDiscInfo(NeroCDInfo cdinfo)
        {
            DiscInfoEntity info = null;
            if (cdinfo != null)
            {

                info = new DiscInfoEntity();
                long l2048 = 2048;//2048转换成long类型
                info.MediaType = m_nero.get_TypeNameOfMedia(cdinfo.MediaType);
                info.StrFreeCapacity = BlockToByte(cdinfo.FreeCapacityInBlocks);
                info.StrUnused = BlockToByte((uint)cdinfo.UnusedBlocks);
                info.StrTotalCapacity = BlockToByte(cdinfo.TotalCapacity);
                info.TotalCapacity = cdinfo.FreeCapacityInBlocks * l2048;
                info.Unused = ((uint)cdinfo.UnusedBlocks) * l2048;
                info.TotalCapacity = cdinfo.TotalCapacity * l2048;
                info.Cdinfo = cdinfo;

            }
            //委托返回信息
            if (ShowDisc != null)
            {
                ShowDisc(info);
            }
        }

        #region 格式化函数
        
      
        private string BlockToByte(int block)
        {
            string Value = string.Empty;
            int temp = FromByteM(block);
            if (temp < 1024)
            {
                Value = string.Format("{0}MB", temp);
            }
            else
            {
                Value = string.Format("{0:N}GB", FromByteG(block));
            }
            return Value;
        }

        private string BlockToByte(uint block)
        {
            string Value = string.Empty;
            int temp = FromByteM(block);
            if (temp < 1024)
            {
                Value = string.Format("{0}MB", temp);
            }
            else
            {
                Value = string.Format("{0:N}GB", FromByteG(block));
            }
            return Value;
        }

        /// <summary>
        /// Block转换MB
        /// </summary>
        /// <param name="block"></param>
        /// <returns></returns>
        private int FromByteM(int block)
        {

            int temp = block * 2 / 1024;
            return temp;
        }

        /// <summary>
        /// Block转换MB
        /// </summary>
        /// <param name="block"></param>
        /// <returns></returns>
        private int FromByteM(uint block)
        {
            uint ut1 = 2;
            uint ut2 = 1024;
            int temp = (int)(block * ut1 / ut2);
            return temp;
        }



        /// <summary>
        /// Block转换GB
        /// </summary>
        /// <param name="block"></param>
        /// <returns></returns>
        private double FromByteG(int block)
        {
            double d1 = (double)block;
            double temp = d1 * 2 / 1024 / 1024;
            return temp;
        }

        /// <summary>
        /// Block转换GB
        /// </summary>
        /// <param name="block"></param>
        /// <returns></returns>
        private double FromByteG(uint block)
        {
            uint ut1 = 2;
            uint ut2 = 1024;
            double d1 = (double)block;
            double temp = (double)(d1 * ut1 / ut2 / ut2);
            return temp;
        }

        #endregion

    }

 有一部分是block转换使用的.SDK获取到的并不在我们常用的单位

光盘信息定义的实体类

/// <summary>
    /// 光盘信息实体类
    /// </summary>
    public class DiscInfoEntity
    {
        /// <summary>
        /// 剩余容量(带单位)
        /// </summary>
        public string StrFreeCapacity { get; set; }

        /// <summary>
        /// 不可用容量(带单位)
        /// </summary>
        public string StrUnused { get; set; }

        /// <summary>
        /// 全部容量(带单位)
        /// </summary>
        public string StrTotalCapacity { get; set; }


        /// <summary>
        /// 剩余容量Byte
        /// </summary>
        public long FreeCapacity { get; set; }

        /// <summary>
        /// 已用容量Byte
        /// </summary>
        public long Unused { get; set; }

        /// <summary>
        /// 全部容量
        /// </summary>
        public long TotalCapacity { get; set; }

        /// <summary>
        /// 光盘类型
        /// </summary>
        public string MediaType { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public NeroCDInfo Cdinfo { get; set; }
    }

 

2:获取刻录机的读写速度

/// <summary>
    /// 刻录速度帮助类
    /// </summary>
    class SpeedHelper
    {
        
        public NeroDrive m_drive;
        private bool m_bWriteSpeeds;
        private _INeroDriveEvents_OnDoneCDInfoEventHandler m_evOnDoneCDInfo;
        internal event GetSpeedEntityCollectionDelegate GetSpeedCollect;

        public SpeedHelper(NeroDrive drive, bool writeSpeed)
        {
            m_drive = drive;
            m_bWriteSpeeds = writeSpeed;
          
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(www.softgogo.com)该刻录光盘SDK简单易用,功能强大稳定,包括了DLL和OCX控件调用方式。专门用于刻录数据、音乐、VCD、SVCD、DVD影碟,支持实时刻录、实时DVD视频光盘录像、加密刻录等强大功能。支持现在市场上的所有光盘,包括CD,DVD,蓝光盘片,支持所有光盘的数据追加刻录,支持多台同时刻录,并且支持所有类型的刻录机。在Demo演示版本中提供了所有功能测试,您可以直接试用。 该SDK的售价包含了授权费用和使用费用,是一次性价格,没有其他任何的收费。使用该SDK发布的产品没有任何时间和数量的限制,无开发人员使用数量限制。 本SDK是标准的Windows动态连接库文件,可独立完成所有功能,刻录底层不依赖其它的任何第3方的环境或者文件。能够轻松的被其它windows应用程序及开发工具调用,包括VB、VC、DELPHI、C#等。提供的用户接口友好且使用简单。本SDK编码质量优良,操作速度快,不会占用及耗费多余的临时硬盘空间,刻录所需要的数据操作全部在内存中完成,已经通过了以上提及的所有CD及DVD盘片测试,并且经过了大量的各种类型的刻录机的检验测试。 本SDK提供的主要接口函数功能有: ·得到盘片信息 ·搽除可搽写盘片 ·设置并得到当前盘片的读写速度 ·弹进弹出光盘托盘 ·得到光驱设备的型号及附带的产品信息 ·得到当前设备支持的写类型 ·刻录镜像文件(*.ISO及其他标准格式的镜像文件)到光盘 ·刻录文件及文件夹到光盘 ·追加刻录文件及文件夹到光盘(Multisession disc) ·刻录VCD/SVCD光盘 ·刻录DVD影碟 ·得到当前刻录进度 ·得到当前正在刻录的文件名 ·得到当前刻录过程中的错误信息 ·停止刻录进程。 ·刻录文件及文件夹到镜像文件(*.iso) ·刻录mp3或者wave文件到音乐光盘 ·得到mp3或者wave文件的文件信息 ·保存音乐光盘中的Audio Track为mp3或者wave文件 ·得到光盘的Track信息 ·复制CD/DVD盘片 ·支持ISO和UDF格式的数据光盘刻录 ·刻录自运行光盘(AutoRun) ·实时刻录 ·实时DVD光盘录像 ·加密刻录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值