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

调用Nero SDK 刻录光盘(含代码)相关推荐

  1. Ajax异步请求(重渲染DOM元素时,如何自动调用并执行JS自定义函数【含代码】)- 案例篇

    文章目录 Ajax异步请求(重渲染DOM元素时,如何自动调用并执行JS自定义函数[含代码])- 案例篇 效果截图: 重要代码: 附:全部HTML代码: Ajax异步请求(重渲染DOM元素时,如何自动调 ...

  2. 【QMT】给QMT量化交易软件安装和调用第三方库(举例通达信pytdx,MyTT,含代码)

    给QMT量化交易软件安装和调用第三方库(举例通达信pytdx,MyTT,含代码) 一.安装QMT 二.给QMT安装python 三.给QMT的python环境安装第三方库 1.准备python虚拟环境 ...

  3. 支付宝支付 第三集:搭建项目及测试(含代码)

    支付宝支付 第三集:搭建项目及测试(含代码) 一.资源 在搭建项目的时候,涉及到了SpringBoot的配置文件properties与yml文件,由于之前的项目使用的全部是properties类型,这 ...

  4. dicom文件_图像识别 | 使用Python对医学Dicom文件的预处理(含代码)

    前沿 在处理医学图像时,常常会遇到以Dicom格式保存的医学图像,如CT.MRI等.Dicom文件是需要专门的软件或者通过编程,应用相应的库进行处理.为了能够更好地服务下游任务,例如分割或检测腹腔CT ...

  5. verilog实例_Verilog设计与逻辑综合实例解析(含代码)(Tasks amp;Functions)

    1.function中的逻辑被综合成了什么? 由于function中没有任何时序结构,function只能综合出组合逻辑. 例如,以下function有2个输入信号和一个控制信号,输出算术运算结果. ...

  6. python dicom 器官分割_图像识别 | 使用Python对医学Dicom文件的预处理(含代码)

    前沿 在处理医学图像时,常常会遇到以Dicom格式保存的医学图像,如CT.MRI等.Dicom文件是需要专门的软件或者通过编程,应用相应的库进行处理.为了能够更好地服务下游任务,例如分割或检测腹腔CT ...

  7. OpenCV与图像处理学习九——连通区域分析算法(含代码)

    OpenCV与图像处理学习九--连通区域分析算法(含代码) 一.连通区域概要 二.Two-Pass算法 三.代码实现 一.连通区域概要 连通区域(Connected Component)一般是指图像中 ...

  8. 郭宏志的android无线点餐系统,Android无线点餐系统--含代码.doc

    Android无线点餐系统--含代码Android无线点餐系统--含代码 Android 无 线 点 餐 系 统 院系:计算机与信息工程学院 班级:**级软件技术一班 姓名: 学号: PAGE \* ...

  9. c语言成绩管理程序设计,成绩管理程序设计报告(含代码C语言

    <成绩管理程序设计报告(含代码C语言>由会员分享,可在线阅读,更多相关<成绩管理程序设计报告(含代码C语言(19页珍藏版)>请在人人文库网上搜索. 1.大连民族学院计算机科学与 ...

最新文章

  1. 干货丨数据科学、机器学习、人工智能,究竟有什么区别?
  2. 减少Android staido 占用C 盘
  3. 【组合数学】生成函数 ( 使用生成函数求解不定方程解个数示例 )
  4. 力扣: 88. 合并两个有序数组
  5. Windows7 最重要的70个技巧和窍门
  6. 内核全新优化UI界面影视双端源码
  7. [猜你喜欢]冠军 yes,boy! 分享 | 推荐系统也可以很简单 做个记录 以后方便学习
  8. tune kubernetes eviction parameter
  9. vsftpd中文目录乱码的解决办法
  10. UIAlertController中TextField的用法
  11. HackerRank SQL练习题答案大全
  12. 04-VUE 常用指令最佳实践
  13. ORACEL R12 总账和子账的关系
  14. 2020十大黄金配资交易平台排名
  15. 乔治亚理工学院计算机专业,佐治亚理工学院计算机专业怎么样?
  16. WPS office根目录在哪?_wps和office的区别是什么
  17. unity_NGUI动态字体制作与字体清晰的几点要素
  18. 1068: 池塘的水草
  19. python中turtle画小草_python
  20. 1072 开学寄语(C语言)

热门文章

  1. 去除office非正版提示的方法(转)
  2. 怎么运行php格式的文件
  3. 用html5如何编写星球运动,HTML5---Canvas-模拟地球-星球运行轨道
  4. Apriori算法和FP-Tree算法简介
  5. 电商页面设计 只需懂六个字
  6. ACA-MB600面包机成功配方(献给最菜的菜鸟们)
  7. mapreduce 模板代码
  8. SpringBoot+Vue项目大学生网络教学平台的设计与实现
  9. 基于SSM实现家政管理平台的开发和实现
  10. 第二代计算机的主要应用领域,第二代计算机的主要应用领域是啥