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

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

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

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

[csharp]  view plain copy
  1. public class NeroBurn  
  2.     {  
  3.         #region 属性  
  4.         private  NeroDrive m_neroDerive;  
  5.         private  Nero m_nero;  
  6.         private bool m_aborted;  
  7.         private string m_burnPath;  
  8.         private bool m_isDoneBurn;  
  9.         private int m_returnCode;//0:失败;1:成功;-1:未知  
  10.         private string m_discvol;  
  11.           
  12.         //nero 委托  
  13.         private _INeroDriveEvents_OnDoneBurnEventHandler m_evOnDoneBurn;  
  14.         private  _INeroDriveEvents_OnAddLogLineEventHandler m_evOnAddLogLine;  
  15.         private _INeroEvents_OnWaitCDEventHandler m_evOnWaitCD;  
  16.         private _INeroDriveEvents_OnAbortedEventHandler m_evOnAborted;  
  17.         private _INeroDriveEvents_OnProgressEventHandler m_evOnProgress;  
  18.         private _INeroEvents_OnWaitCDDoneEventHandler m_evOnWaitCDDone;  
  19.          
  20.         #endregion   
  21.  
  22.         #region 构造函数  
  23.   
  24.         /// <summary></summary>  
  25.         /// 构造函数  
  26.         ///   
  27.         /// <param name="driverletter">盘符  
  28.         /// <param name="burnpath">待刻录的文件路径  
  29.         /// <param name="discvol">盘的卷标  
  30.         public NeroBurn(string driverletter,string burnpath,string discvol)  
  31.         {  
  32.             m_burnPath = burnpath;  
  33.             m_nero = new NeroClass();  
  34.             m_neroDerive = allocDevice(driverletter);  
  35.             m_aborted = false;  
  36.             m_isDoneBurn = false;  
  37.             m_discvol = discvol;  
  38.         }  
  39.  
  40.         #endregion   
  41.          
  42.         #region Nero事件处理  
  43.   
  44.         /// <summary></summary>  
  45.         /// 发起刻录事件  
  46.         ///   
  47.         /// <param name="bSubscribe">  
  48.         private  void SubscribeToEvents(bool bSubscribe)  
  49.         {  
  50.             if (bSubscribe)  
  51.             {  
  52.                 m_evOnAddLogLine = new _INeroDriveEvents_OnAddLogLineEventHandler(m_drive_OnAddLogLine);  
  53.                 m_neroDerive.OnAddLogLine += m_evOnAddLogLine;  
  54.                 m_evOnWaitCD = new _INeroEvents_OnWaitCDEventHandler(m_nero_OnWaitCD);  
  55.                 m_nero.OnWaitCD += m_evOnWaitCD;  
  56.                 m_evOnDoneBurn = new _INeroDriveEvents_OnDoneBurnEventHandler(m_drive_OnDoneBurn);  
  57.                 m_neroDerive.OnDoneBurn += m_evOnDoneBurn;  
  58.                 m_evOnWaitCDDone = new _INeroEvents_OnWaitCDDoneEventHandler(m_nero_OnWaitCDDone);  
  59.                 m_nero.OnWaitCDDone += m_evOnWaitCDDone;  
  60.                 m_evOnProgress = new _INeroDriveEvents_OnProgressEventHandler(m_drive_OnProgress);  
  61.                 m_neroDerive.OnProgress += m_evOnProgress;  
  62.             }  
  63.             else  
  64.             {                 
  65.                 m_neroDerive.OnAddLogLine -= m_evOnAddLogLine;  
  66.                 m_nero.OnWaitCD -= m_evOnWaitCD;  
  67.                 m_nero.OnWaitCDDone -= m_evOnWaitCDDone;  
  68.                 m_neroDerive.OnDoneBurn -= m_evOnDoneBurn;  
  69.                 m_neroDerive.OnProgress -= m_evOnProgress;  
  70.             }  
  71.         }  
  72.         private void m_drive_OnProgress(ref int ProgressInPercent, ref bool Abort)  
  73.         {  
  74.             // This events gives us an opportunity to show progress  
  75.             // as well as abort if needed.  
  76.             //   
  77.             Abort = m_aborted;              
  78.   
  79.             Console.WriteLine("光盘" + m_discvol + " " + ProgressInPercent.ToString() + "% had Burned!!");  
  80.             //c_TaskPercent.Text = ProgressInPercent.ToString() + "%";  
  81.         }  
  82.         private void m_nero_OnWaitCDDone()  
  83.         {  
  84.             // When waiting on a disc is done, make sure to  
  85.             // enable us and hide the WaitCD form.  
  86.             //   
  87.             Console.WriteLine("a Disc has inserted!");  
  88.         }  
  89.         /// <summary></summary>  
  90.         ///刻录完成,不管失败成功!   
  91.         ///   
  92.         /// <param name="StatusCode">  
  93.         private void m_drive_OnDoneBurn(ref NERO_BURN_ERROR StatusCode)  
  94.         {  
  95.             // When burning is over, make sure to unsubscribe from all  
  96.             // events.  
  97.             //   
  98.             SubscribeToEvents(false);  
  99.             if (StatusCode == NERO_BURN_ERROR.NERO_BURN_OK)  
  100.             {  
  101.                 m_returnCode = 1;  
  102.                 Console.WriteLine(m_neroDerive.DriveLetter + "盘卷标为 " + m_discvol + " 刻录成功!!");  
  103.             }  
  104.             else  
  105.             {  
  106.                 m_returnCode = 0;  
  107.                 Console.WriteLine(m_neroDerive.DriveLetter + "盘卷标为 " + m_discvol + " 刻录失败!!");  
  108.             }  
  109.   
  110.             m_isDoneBurn = true;  
  111.   
  112.             Console.WriteLine("Burn Finish!!");  
  113.         }  
  114.   
  115.         /// <summary></summary>  
  116.         /// 如果光驱为空,等待光驱  
  117.         ///   
  118.         /// <param name="WaitCD">  
  119.         /// <param name="WaitCDLocalizedText">  
  120.         private void m_nero_OnWaitCD(ref NERO_WAITCD_TYPE WaitCD, ref string WaitCDLocalizedText)  
  121.         {  
  122.             Console.WriteLine("Wait CD...");  
  123.         }  
  124.   
  125.         /// <summary></summary>  
  126.         /// 写日志  
  127.         ///   
  128.         /// <param name="TextType">  
  129.         /// <param name="Text">  
  130.         private  void m_drive_OnAddLogLine(ref NERO_TEXT_TYPE TextType, ref string Text)  
  131.         {  
  132.               
  133.             Console.WriteLine( Text);  
  134.         }  
  135.  
  136.         #endregion   
  137.  
  138.         #region 申请设备  
  139.   
  140.         /// <summary></summary>  
  141.         /// 申请设备  
  142.         ///   
  143.         /// <param name="driverletter">  
  144.         /// <returns></returns>  
  145.         private NeroDrive allocDevice(string driverletter)  
  146.         {  
  147.   
  148.             NeroDrives drives = m_nero.GetDrives(NERO_MEDIA_TYPE.NERO_MEDIA_DVD_M);  
  149.             if (drives.Count > 0)  
  150.             {  
  151.                 foreach (NeroDrive d in drives)  
  152.                 {  
  153.                     if (driverletter.ToLower().Contains(d.DriveLetter.ToLower()))  
  154.                         return d;  
  155.   
  156.                 }  
  157.             }  
  158.   
  159.             return null;  
  160.   
  161.         }  
  162.  
  163.         #endregion   
  164.  
  165.         #region 刻录  
  166.   
  167.         /// <summary></summary>  
  168.         /// 刻录  
  169.         ///   
  170.         /// <returns></returns>0: 失败;1:成功;-1:未知错误  
  171.         public int Burn()  
  172.         {  
  173.             m_isDoneBurn = false;      
  174.           
  175.             SubscribeToEvents(true);  
  176.   
  177.             NeroISOTrack isoTrack = new NeroISOTrackClass();  
  178.             isoTrack.BurnOptions = (NERO_BURN_OPTIONS)((uint)NERO_BURN_OPTIONS.NERO_BURN_OPTION_CREATE_ISO_FS + (uint)NERO_BURN_OPTIONS.NERO_BURN_OPTION_USE_JOLIET);  
  179.             isoTrack.Name = m_discvol;  
  180.   
  181.             Console.WriteLine("Begin AddFilesAndFoldersToISOTrack.");  
  182.             AddFilesAndFoldersToISOTrack(ref isoTrack, m_burnPath);  
  183.             Console.WriteLine("End AddFilesAndFoldersToISOTrack.");  
  184.   
  185.             if (isoTrack.RootFolder.Files.Count == 0 &&  
  186.                     isoTrack.RootFolder.Folders.Count == 0)  
  187.             {  
  188.                 isoTrack = null;  
  189.                 return 0;  
  190.             }  
  191.   
  192.             NERO_BURN_FLAGS flags = new NERO_BURN_FLAGS();  
  193.             flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_WRITE;  
  194.             flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_CLOSE_SESSION;  
  195.             flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_BUF_UNDERRUN_PROT;  
  196.             flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_DISABLE_ABORT;  
  197.             flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_DAO;  
  198.             flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_CD_TEXT;  
  199.             flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_DETECT_NON_EMPTY_CDRW;  
  200.             flags = flags | NERO_BURN_FLAGS.NERO_BURN_FLAG_SPEED_IN_KBS;    
  201.   
  202.             try  
  203.             {  
  204.                 if (null == m_neroDerive)  
  205.                 {  
  206.                     Console.WriteLine("m_neroDerive is null!!");  
  207.                     return -1;  
  208.                 }  
  209.                   
  210.                 int speed = 10000;  
  211.   
  212.                 string BurnSpeed_s = System.Configuration.ConfigurationSettings.AppSettings["BurnSpeed"];  
  213.                   
  214.                 if (!string.IsNullOrEmpty(BurnSpeed_s))  
  215.                     speed = int.Parse(BurnSpeed_s);  
  216.   
  217.                 m_neroDerive.BurnIsoAudioCD(""""false,  
  218.                     isoTrack,  
  219.                     null,  
  220.                     null,  
  221.                     flags,  
  222.                         speed,  
  223.                         NERO_MEDIA_TYPE.NERO_MEDIA_DVD_M);  
  224.   
  225.                 //循环执行,等待刻录完成  
  226.                 while (true)  
  227.                 {  
  228.                     if(m_isDoneBurn)  //如果刻录完成  
  229.                         return m_returnCode;  
  230.   
  231.                     System.Threading.Thread.Sleep(1000);  
  232.                 }  
  233.             }  
  234.             catch (Exception e)  
  235.             {  
  236.                 m_aborted = true;  
  237.                 Console.WriteLine("Burn Error : "+e.Message);  
  238.                 return 0;  
  239.             }  
  240.   
  241.             return -1;  
  242.         }  
  243.  
  244.         #endregion   
  245.  
  246.         #region 辅助函数  
  247.         /// <summary></summary>  
  248.         /// This function adds the files and folders to the supplied NeroISOTrack.  
  249.         /// Add by Cola 2008-4-14  
  250.         ///   
  251.         /// <param name="isoTrack">  
  252.         /// <param name="discPath">  
  253.         private  void AddFilesAndFoldersToISOTrack(ref NeroISOTrack isoTrack, string discPath)  
  254.         {  
  255.             string sPath = discPath;  
  256.   
  257.             // The string should really not be empty...  
  258.             //   
  259.             if (sPath != "")  
  260.             {  
  261.                 // If path ends in a backslash, it is a folder.  
  262.                 //   
  263.                 if (sPath[sPath.Length - 1] == '//')  
  264.                 {  
  265.                     NeroFolder folder = isoTrack.RootFolder;  
  266.                     AddFolderRecursively(ref folder, sPath);  
  267.                 }  
  268.                 else  
  269.                 {  
  270.                     // This is a file. Create a new NeroFile  
  271.                     // change its properties.  
  272.                     //   
  273.                     NeroFile file = new NeroFileClass();  
  274.                     file.SourceFilePath = sPath;  
  275.                     file.Name = Path.GetFileName(sPath);  
  276.                     file.EntryTime = Directory.GetLastWriteTime(sPath);  
  277.   
  278.                     // In this implementation, specified files are added  
  279.                     // to the root of the disc only.  
  280.                     //   
  281.                     isoTrack.RootFolder.Files.Add(file);  
  282.                 }  
  283.             }  
  284.   
  285.         }  
  286.   
  287.   
  288.         /// <summary></summary>  
  289.         /// This function is used to recursively add the path to the supplied  
  290.         /// parent NeroFolder. Add by Cola 2008-4-14  
  291.         ///   
  292.         /// <param name="folderParent">  
  293.         /// <param name="sPath">  
  294.         private  void AddFolderRecursively(ref NeroFolder folderParent, string sPath)  
  295.         {  
  296.             NeroFolder folder = new NeroFolderClass();  
  297.             folderParent.Folders.Add(folder);  
  298.   
  299.             string[] sSplits = sPath.Split(new char[] { '//' }, sPath.Length);  
  300.             if (sSplits.GetLength(0) >= 2)  
  301.             {  
  302.                 string sFolderName = sSplits[sSplits.GetLength(0) - 2];  
  303.                 folder.Name = sFolderName;  
  304.   
  305.                 string[] sDirectories = Directory.GetDirectories(sPath);  
  306.                 foreach (string sSubDirPath in sDirectories)  
  307.                 {  
  308.                     AddFolderRecursively(ref folder, sSubDirPath + "//");  
  309.                 }  
  310.             }  
  311.   
  312.             string[] sFiles = Directory.GetFiles(sPath);  
  313.             foreach (string sFile in sFiles)  
  314.             {  
  315.                 NeroFile file = new NeroFileClass();  
  316.                 file.SourceFilePath = sFile;  
  317.                 file.Name = Path.GetFileName(sFile);  
  318.                 file.EntryTime = Directory.GetLastWriteTime(sFile);  
  319.   
  320.                 folder.Files.Add(file);  
  321.             }  
  322.         }  
  323.  
  324.         #endregion   
  325.   
  326.     }  
[csharp]  view plain copy
  1. 然后,在Main函数中调用NeroBurn类的方法,Main函数的参数如下:  
[csharp]  view plain copy
  1. <pre class="csharp" name="code">static int Main(string[] args)  
  2.         {  
  3.             string driverletter; //驱动器盘符,含':'号   
  4.             string burnpath;     //刻录文件目录  
  5.             string discvol;      //光盘卷标  
  6.             if (args.Length == 3)  
  7.             {  
  8.                 driverletter = args[0];  
  9.                 burnpath = args[1];  
  10.                 discvol = args[2];  
  11.                 NeroBurn b = new NeroBurn(driverletter, burnpath, discvol);  
  12.                 int ret = b.Burn();  
  13.                   
  14.                 return ret;  
  15.             }  
  16.               
  17.   
  18.             return -1;</pre>  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值