调用Nero SDK 刻录光盘(含代码)

来源:互联网 发布:响应式源码 编辑:程序博客网 时间:2024/05/22 01:46

        项目中有多光驱刻录的需求,但在一个进程里同时启动多个刻录任务,进程经常报异常,于是把刻录部分单独做了个控制台程序,每个光驱刻录就启动一个进程去执行刻录任务,这样就算刻录进程出错也不会影响到父进程。

        以下是Nero 刻碟的类,SDK采用NeroSDK-1.08版本,调用NeroCOM组件。调用时必须引用Interop.NEROLib.dll 和 Interop.NeroVisionAPI.dll 两个dll。

public class NeroBurn    {        #region 属性        private  NeroDrive m_neroDerive;        private  Nero m_nero;        private bool m_aborted;        private string m_burnPath;        private bool m_isDoneBurn;        private int m_returnCode;//0:失败;1:成功;-1:未知        private string m_discvol;                //nero 委托        private _INeroDriveEvents_OnDoneBurnEventHandler m_evOnDoneBurn;        private  _INeroDriveEvents_OnAddLogLineEventHandler m_evOnAddLogLine;        private _INeroEvents_OnWaitCDEventHandler m_evOnWaitCD;        private _INeroDriveEvents_OnAbortedEventHandler m_evOnAborted;        private _INeroDriveEvents_OnProgressEventHandler m_evOnProgress;        private _INeroEvents_OnWaitCDDoneEventHandler m_evOnWaitCDDone;                #endregion         #region 构造函数        ///         /// 构造函数        ///         /// 盘符        /// 待刻录的文件路径        /// 盘的卷标        public NeroBurn(string driverletter,string burnpath,string discvol)        {            m_burnPath = burnpath;            m_nero = new NeroClass();            m_neroDerive = allocDevice(driverletter);            m_aborted = false;            m_isDoneBurn = false;            m_discvol = discvol;        }        #endregion                 #region Nero事件处理        ///         /// 发起刻录事件        ///         ///         private  void SubscribeToEvents(bool bSubscribe)        {            if (bSubscribe)            {                m_evOnAddLogLine = new _INeroDriveEvents_OnAddLogLineEventHandler(m_drive_OnAddLogLine);                m_neroDerive.OnAddLogLine += m_evOnAddLogLine;                m_evOnWaitCD = new _INeroEvents_OnWaitCDEventHandler(m_nero_OnWaitCD);                m_nero.OnWaitCD += m_evOnWaitCD;                m_evOnDoneBurn = new _INeroDriveEvents_OnDoneBurnEventHandler(m_drive_OnDoneBurn);                m_neroDerive.OnDoneBurn += m_evOnDoneBurn;                m_evOnWaitCDDone = new _INeroEvents_OnWaitCDDoneEventHandler(m_nero_OnWaitCDDone);                m_nero.OnWaitCDDone += m_evOnWaitCDDone;                m_evOnProgress = new _INeroDriveEvents_OnProgressEventHandler(m_drive_OnProgress);                m_neroDerive.OnProgress += m_evOnProgress;            }            else            {                               m_neroDerive.OnAddLogLine -= m_evOnAddLogLine;                m_nero.OnWaitCD -= m_evOnWaitCD;                m_nero.OnWaitCDDone -= m_evOnWaitCDDone;                m_neroDerive.OnDoneBurn -= m_evOnDoneBurn;                m_neroDerive.OnProgress -= m_evOnProgress;            }        }        private void m_drive_OnProgress(ref int ProgressInPercent, ref bool Abort)        {            // This events gives us an opportunity to show progress            // as well as abort if needed.            //             Abort = m_aborted;                        Console.WriteLine("光盘" + m_discvol + " " + ProgressInPercent.ToString() + "% had Burned!!");            //c_TaskPercent.Text = ProgressInPercent.ToString() + "%";        }        private void m_nero_OnWaitCDDone()        {            // When waiting on a disc is done, make sure to            // enable us and hide the WaitCD form.            //             Console.WriteLine("a Disc has inserted!");        }        ///         ///刻录完成,不管失败成功!         ///         ///         private void m_drive_OnDoneBurn(ref NERO_BURN_ERROR StatusCode)        {            // When burning is over, make sure to unsubscribe from all            // events.            //             SubscribeToEvents(false);            if (StatusCode == NERO_BURN_ERROR.NERO_BURN_OK)            {                m_returnCode = 1;                Console.WriteLine(m_neroDerive.DriveLetter + "盘卷标为 " + m_discvol + " 刻录成功!!");            }            else            {                m_returnCode = 0;                Console.WriteLine(m_neroDerive.DriveLetter + "盘卷标为 " + m_discvol + " 刻录失败!!");            }            m_isDoneBurn = true;            Console.WriteLine("Burn Finish!!");        }        ///         /// 如果光驱为空,等待光驱        ///         ///         ///         private void m_nero_OnWaitCD(ref NERO_WAITCD_TYPE WaitCD, ref string WaitCDLocalizedText)        {            Console.WriteLine("Wait CD...");        }        ///         /// 写日志        ///         ///         ///         private  void m_drive_OnAddLogLine(ref NERO_TEXT_TYPE TextType, ref string Text)        {                        Console.WriteLine( Text);        }        #endregion         #region 申请设备        ///         /// 申请设备        ///         ///         ///         private NeroDrive allocDevice(string driverletter)        {            NeroDrives drives = m_nero.GetDrives(NERO_MEDIA_TYPE.NERO_MEDIA_DVD_M);            if (drives.Count > 0)            {                foreach (NeroDrive d in drives)                {                    if (driverletter.ToLower().Contains(d.DriveLetter.ToLower()))                        return d;                }            }            return null;        }        #endregion         #region 刻录        ///         /// 刻录        ///         /// 0: 失败;1:成功;-1:未知错误        public int Burn()        {            m_isDoneBurn = false;                        SubscribeToEvents(true);            NeroISOTrack isoTrack = new NeroISOTrackClass();            isoTrack.BurnOptions = (NERO_BURN_OPTIONS)((uint)NERO_BURN_OPTIONS.NERO_BURN_OPTION_CREATE_ISO_FS + (uint)NERO_BURN_OPTIONS.NERO_BURN_OPTION_USE_JOLIET);            isoTrack.Name = m_discvol;            Console.WriteLine("Begin AddFilesAndFoldersToISOTrack.");            AddFilesAndFoldersToISOTrack(ref isoTrack, m_burnPath);            Console.WriteLine("End AddFilesAndFoldersToISOTrack.");            if (isoTrack.RootFolder.Files.Count == 0 &&                    isoTrack.RootFolder.Folders.Count == 0)            {                isoTrack = null;                return 0;            }            NERO_BURN_FLAGS flags = new NERO_BURN_FLAGS();            flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_WRITE;            flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_CLOSE_SESSION;            flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_BUF_UNDERRUN_PROT;            flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_DISABLE_ABORT;            flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_DAO;            flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_CD_TEXT;            flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_DETECT_NON_EMPTY_CDRW;            flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_SPEED_IN_KBS;              try            {                if (null == m_neroDerive)                {                    Console.WriteLine("m_neroDerive is null!!");                    return -1;                }                                int speed = 10000;                string BurnSpeed_s = System.Configuration.ConfigurationSettings.AppSettings["BurnSpeed"];                                if (!string.IsNullOrEmpty(BurnSpeed_s))                    speed = int.Parse(BurnSpeed_s);                m_neroDerive.BurnIsoAudioCD("", "", false,                    isoTrack,                    null,                    null,                    flags,                        speed,                        NERO_MEDIA_TYPE.NERO_MEDIA_DVD_M);                //循环执行,等待刻录完成                while (true)                {                    if(m_isDoneBurn)  //如果刻录完成                        return m_returnCode;                    System.Threading.Thread.Sleep(1000);                }            }            catch (Exception e)            {                m_aborted = true;                Console.WriteLine("Burn Error : "+e.Message);                return 0;            }            return -1;        }        #endregion         #region 辅助函数        ///         /// This function adds the files and folders to the supplied NeroISOTrack.        /// Add by Cola 2008-4-14        ///         ///         ///         private  void AddFilesAndFoldersToISOTrack(ref NeroISOTrack isoTrack, string discPath)        {            string sPath = discPath;            // The string should really not be empty...            //             if (sPath != "")            {                // If path ends in a backslash, it is a folder.                //                 if (sPath[sPath.Length - 1] == '//')                {                    NeroFolder folder = isoTrack.RootFolder;                    AddFolderRecursively(ref folder, sPath);                }                else                {                    // This is a file. Create a new NeroFile                    // change its properties.                    //                     NeroFile file = new NeroFileClass();                    file.SourceFilePath = sPath;                    file.Name = Path.GetFileName(sPath);                    file.EntryTime = Directory.GetLastWriteTime(sPath);                    // In this implementation, specified files are added                    // to the root of the disc only.                    //                     isoTrack.RootFolder.Files.Add(file);                }            }        }        ///         /// This function is used to recursively add the path to the supplied        /// parent NeroFolder. Add by Cola 2008-4-14        ///         ///         ///         private  void AddFolderRecursively(ref NeroFolder folderParent, string sPath)        {            NeroFolder folder = new NeroFolderClass();            folderParent.Folders.Add(folder);            string[] sSplits = sPath.Split(new char[] { '//' }, sPath.Length);            if (sSplits.GetLength(0) >= 2)            {                string sFolderName = sSplits[sSplits.GetLength(0) - 2];                folder.Name = sFolderName;                string[] sDirectories = Directory.GetDirectories(sPath);                foreach (string sSubDirPath in sDirectories)                {                    AddFolderRecursively(ref folder, sSubDirPath + "//");                }            }            string[] sFiles = Directory.GetFiles(sPath);            foreach (string sFile in sFiles)            {                NeroFile file = new NeroFileClass();                file.SourceFilePath = sFile;                file.Name = Path.GetFileName(sFile);                file.EntryTime = Directory.GetLastWriteTime(sFile);                folder.Files.Add(file);            }        }        #endregion     }
   然后,在Main函数中调用NeroBurn类的方法,Main函数的参数如下:
static int Main(string[] args)        {            string driverletter; //驱动器盘符,含':'号             string burnpath;     //刻录文件目录            string discvol;      //光盘卷标            if (args.Length == 3)            {                driverletter = args[0];                burnpath = args[1];                discvol = args[2];                NeroBurn b = new NeroBurn(driverletter, burnpath, discvol);                int ret = b.Burn();                                return ret;            }                        return -1;
原创粉丝点击