C#调用Nero SDK刻录光盘的方法
本文实例讲述了C#调用NeroSDK刻录光盘的方法。分享给大家供大家参考。具体如下:
项目中有多光驱刻录的需求,但在一个进程里同时启动多个刻录任务,进程经常报异常,于是把刻录部分单独做了个控制台程序,每个光驱刻录就启动一个进程去执行刻录任务,这样就算刻录进程出错也不会影响到父进程。
以下是Nero刻碟的类,SDK采用NeroSDK-1.08版本,调用NeroCOM组件。调用时必须引用Interop.NEROLib.dll和Interop.NeroVisionAPI.dll两个dll。
publicclassNeroBurn { #region属性 privateNeroDrivem_neroDerive; privateNerom_nero; privateboolm_aborted; privatestringm_burnPath; privateboolm_isDoneBurn; privateintm_returnCode;//0:失败;1:成功;-1:未知 privatestringm_discvol; //nero委托 private_INeroDriveEvents_OnDoneBurnEventHandlerm_evOnDoneBurn; private_INeroDriveEvents_OnAddLogLineEventHandlerm_evOnAddLogLine; private_INeroEvents_OnWaitCDEventHandlerm_evOnWaitCD; private_INeroDriveEvents_OnAbortedEventHandlerm_evOnAborted; private_INeroDriveEvents_OnProgressEventHandlerm_evOnProgress; private_INeroEvents_OnWaitCDDoneEventHandlerm_evOnWaitCDDone; #endregion #region构造函数 ///<summary></summary> ///构造函数 /// ///<paramname="driverletter">盘符 ///<paramname="burnpath">待刻录的文件路径 ///<paramname="discvol">盘的卷标 publicNeroBurn(stringdriverletter,stringburnpath,stringdiscvol) { m_burnPath=burnpath; m_nero=newNeroClass(); m_neroDerive=allocDevice(driverletter); m_aborted=false; m_isDoneBurn=false; m_discvol=discvol; } #endregion #regionNero事件处理 ///<summary></summary> ///发起刻录事件 /// ///<paramname="bSubscribe"> privatevoidSubscribeToEvents(boolbSubscribe) { 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; } } privatevoidm_drive_OnProgress(refintProgressInPercent,refboolAbort) { //Thiseventsgivesusanopportunitytoshowprogress //aswellasabortifneeded. // Abort=m_aborted; Console.WriteLine("光盘"+m_discvol+""+ProgressInPercent.ToString()+"%hadBurned!!"); //c_TaskPercent.Text=ProgressInPercent.ToString()+"%"; } privatevoidm_nero_OnWaitCDDone() { //Whenwaitingonadiscisdone,makesureto //enableusandhidetheWaitCDform. // Console.WriteLine("aDischasinserted!"); } ///<summary></summary> ///刻录完成,不管失败成功! /// ///<paramname="StatusCode"> privatevoidm_drive_OnDoneBurn(refNERO_BURN_ERRORStatusCode) { //Whenburningisover,makesuretounsubscribefromall //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("BurnFinish!!"); } ///<summary></summary> ///如果光驱为空,等待光驱 /// ///<paramname="WaitCD"> ///<paramname="WaitCDLocalizedText"> privatevoidm_nero_OnWaitCD(refNERO_WAITCD_TYPEWaitCD,refstringWaitCDLocalizedText) { Console.WriteLine("WaitCD..."); } ///<summary></summary> ///写日志 /// ///<paramname="TextType"> ///<paramname="Text"> privatevoidm_drive_OnAddLogLine(refNERO_TEXT_TYPETextType,refstringText) { Console.WriteLine(Text); } #endregion #region申请设备 ///<summary></summary> ///申请设备 /// ///<paramname="driverletter"> ///<returns></returns> privateNeroDriveallocDevice(stringdriverletter) { NeroDrivesdrives=m_nero.GetDrives(NERO_MEDIA_TYPE.NERO_MEDIA_DVD_M); if(drives.Count>0) { foreach(NeroDrivedindrives) { if(driverletter.ToLower().Contains(d.DriveLetter.ToLower())) returnd; } } returnnull; } #endregion #region刻录 ///<summary></summary> ///刻录 /// ///<returns></returns>0:失败;1:成功;-1:未知错误 publicintBurn() { m_isDoneBurn=false; SubscribeToEvents(true); NeroISOTrackisoTrack=newNeroISOTrackClass(); 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("BeginAddFilesAndFoldersToISOTrack."); AddFilesAndFoldersToISOTrack(refisoTrack,m_burnPath); Console.WriteLine("EndAddFilesAndFoldersToISOTrack."); if(isoTrack.RootFolder.Files.Count==0&& isoTrack.RootFolder.Folders.Count==0) { isoTrack=null; return0; } NERO_BURN_FLAGSflags=newNERO_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_neroDeriveisnull!!"); return-1; } intspeed=10000; stringBurnSpeed_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)//如果刻录完成 returnm_returnCode; System.Threading.Thread.Sleep(1000); } } catch(Exceptione) { m_aborted=true; Console.WriteLine("BurnError:"+e.Message); return0; } return-1; } #endregion #region辅助函数 ///<summary></summary> ///ThisfunctionaddsthefilesandfolderstothesuppliedNeroISOTrack. ///AddbyCola2008-4-14 /// ///<paramname="isoTrack"> ///<paramname="discPath"> privatevoidAddFilesAndFoldersToISOTrack(refNeroISOTrackisoTrack,stringdiscPath) { stringsPath=discPath; //Thestringshouldreallynotbeempty... // if(sPath!="") { //Ifpathendsinabackslash,itisafolder. // if(sPath[sPath.Length-1]=='//') { NeroFolderfolder=isoTrack.RootFolder; AddFolderRecursively(reffolder,sPath); } else { //Thisisafile.CreateanewNeroFile //changeitsproperties. // NeroFilefile=newNeroFileClass(); file.SourceFilePath=sPath; file.Name=Path.GetFileName(sPath); file.EntryTime=Directory.GetLastWriteTime(sPath); //Inthisimplementation,specifiedfilesareadded //totherootofthedisconly. // isoTrack.RootFolder.Files.Add(file); } } } ///<summary></summary> ///Thisfunctionisusedtorecursivelyaddthepathtothesupplied ///parentNeroFolder.AddbyCola2008-4-14 /// ///<paramname="folderParent"> ///<paramname="sPath"> privatevoidAddFolderRecursively(refNeroFolderfolderParent,stringsPath) { NeroFolderfolder=newNeroFolderClass(); folderParent.Folders.Add(folder); string[]sSplits=sPath.Split(newchar[]{'//'},sPath.Length); if(sSplits.GetLength(0)>=2) { stringsFolderName=sSplits[sSplits.GetLength(0)-2]; folder.Name=sFolderName; string[]sDirectories=Directory.GetDirectories(sPath); foreach(stringsSubDirPathinsDirectories) { AddFolderRecursively(reffolder,sSubDirPath+"//"); } } string[]sFiles=Directory.GetFiles(sPath); foreach(stringsFileinsFiles) { NeroFilefile=newNeroFileClass(); file.SourceFilePath=sFile; file.Name=Path.GetFileName(sFile); file.EntryTime=Directory.GetLastWriteTime(sFile); folder.Files.Add(file); } } #endregion }
然后,在Main函数中调用NeroBurn类的方法,Main函数的参数如下:
staticintMain(string[]args) { stringdriverletter;//驱动器盘符,含':'号 stringburnpath;//刻录文件目录 stringdiscvol;//光盘卷标 if(args.Length==3) { driverletter=args[0]; burnpath=args[1]; discvol=args[2]; NeroBurnb=newNeroBurn(driverletter,burnpath,discvol); intret=b.Burn(); returnret; } return-1;
希望本文所述对大家的C#程序设计有所帮助。