C#调用Nero SDK刻录光盘的方法

本文实例讲述了C#调用Nero SDK刻录光盘的方法。分享给大家供大家参考。具体如下:

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

以下是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 构造函数
  /// <summary></summary>
  /// 构造函数
  ///
  /// <param name="driverletter">盘符
  /// <param name="burnpath">待刻录的文件路径
  /// <param name="discvol">盘的卷标
  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事件处理
  /// <summary></summary>
  /// 发起刻录事件
  ///
  /// <param name="bSubscribe">
  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!");
  }
  /// <summary></summary>
  ///刻录完成,不管失败成功!
  ///
  /// <param name="StatusCode">
  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!!");
  }
  /// <summary></summary>
  /// 如果光驱为空,等待光驱
  ///
  /// <param name="WaitCD">
  /// <param name="WaitCDLocalizedText">
  private void m_nero_OnWaitCD(ref NERO_WAITCD_TYPE WaitCD, ref string WaitCDLocalizedText)
  {
   Console.WriteLine("Wait CD...");
  }
  /// <summary></summary>
  /// 写日志
  ///
  /// <param name="TextType">
  /// <param name="Text">
  private void m_drive_OnAddLogLine(ref NERO_TEXT_TYPE TextType, ref string Text)
  {
   Console.WriteLine( Text);
  }
  #endregion
  #region 申请设备
  /// <summary></summary>
  /// 申请设备
  ///
  /// <param name="driverletter">
  /// <returns></returns>
  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 刻录
  /// <summary></summary>
  /// 刻录
  ///
  /// <returns></returns>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 辅助函数
  /// <summary></summary>
  /// This function adds the files and folders to the supplied NeroISOTrack.
  /// Add by Cola 2008-4-14
  ///
  /// <param name="isoTrack">
  /// <param name="discPath">
  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);
    }
   }
  }
  /// <summary></summary>
  /// This function is used to recursively add the path to the supplied
  /// parent NeroFolder. Add by Cola 2008-4-14
  ///
  /// <param name="folderParent">
  /// <param name="sPath">
  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;

希望本文所述对大家的C#程序设计有所帮助。

(0)

相关推荐

  • C#中调用SAPI实现语音合成的2种方法

    我们都知道现在的语音合成TTS是可以通过微软的SAPI实现的,好处我就不多说了,方便而已,因为在微软的操作系统里面就自带了这个玩意,主要的方式有两种: 1.使用COM组件技术,不管是C++,C#,Delphi都能玩的转,开发出来的东西在XP和WIN7都能跑.(要引入SpeechLib,好像在项目上点引用,然后选到系统COM吧,好久没弄,记不清楚了) 2.使用WIN7的windows api,其实最终还是调用了SAPI,所以开发出来的东西就只能在WIN7上面跑. 其实不管是哪一种,都是调用SAPI

  • C#调用系统API指定快捷键的方法

    本文实例讲述了C#调用系统API指定快捷键的方法.分享给大家供大家参考.具体分析如下: 快捷键的作用大家都清楚,就是快捷嘛,操作起来方便.用电脑的人很少有没用过Ctrl + C 和Ctrl + V的. 其他很多软件也有各种快捷键.电脑自然没那么聪明,知道我们敲哪些键然后给出相应反应,这都得我们自己写代码实现啊.指定快捷键有两种方式. 方法一.当应用程序某个页面获得焦点时,直接写一个该页面的KeyDown事件处理函数就行,非常的简单.我们大多数时候就用的这种快捷键. 方法二.在任何时候都能使用快捷

  • C#动态webservice调用接口

    C#动态webservice调用接口 using System; using System.Collections; using System.IO; using System.Net; using System.Text; using System.Xml; using System.Xml.Serialization; namespace Hishop.Plugins { /// <summary> /// 利用WebRequest/WebResponse进行WebService调用的类

  • C#实现快递api接口调用方法

    无平台限制,依赖于快递api网接口 ----------------实体类 [DataContract] public class SyncResponseEntity { public SyncResponseEntity() { } /// <summary> /// 需要查询的快递代号 /// </summary> [DataMember(Order = 0, Name = "id")] public string ID { get; set; } ///

  • C#检测pc光驱里是否插入了光盘的方法

    本文实例讲述了C#检测pc光驱里是否插入了光盘的方法.分享给大家供大家参考.具体如下: C# 检测pc光驱里是否插入了光盘,需要添加System.Management.dll 的引用 using System; using System.Management; namespace CDROMManagement { class WMIEvent { static void Main(string[] args) { WMIEvent we = new WMIEvent(); Management

  • C#调用WinRar执行rar、zip压缩的方法

    本文实例讲述了C#调用WinRar执行rar.zip压缩的方法.分享给大家供大家参考.具体如下: 判断系统是否安装了winrar /// <summary> /// 验证WinRar是否安装. /// </summary> /// <returns>true:已安装,false:未安装</returns> private static bool ExistsRar(out String winRarPath) { winRarPath = String.Em

  • C#中调用SAPI实现语音识别的2种方法

    通过微软的SAPI,不仅仅可以实现语音合成TTS,同样可以实现语音识别SR.下面我们就介绍并贴出相关代码.主要有两种方式: 1.使用COM组件技术,不管是C++,C#,Delphi都能玩的转,开发出来的东西在XP和WIN7都能跑.(注意要引入系统组件SpeechLib,XP要安装识别引擎) 2.使用WIN7的windows api,其实最终还是调用了SAPI,所以开发出来的东西就只能在WIN7上面跑. 其实不管是哪一种,都是调用SAPI,可能后一种代码比较简单. 使用第一种方式,需要注意在COM

  • C#调用Nero SDK刻录光盘的方法

    本文实例讲述了C#调用Nero SDK刻录光盘的方法.分享给大家供大家参考.具体如下: 项目中有多光驱刻录的需求,但在一个进程里同时启动多个刻录任务,进程经常报异常,于是把刻录部分单独做了个控制台程序,每个光驱刻录就启动一个进程去执行刻录任务,这样就算刻录进程出错也不会影响到父进程. 以下是Nero 刻碟的类,SDK采用NeroSDK-1.08版本,调用NeroCOM组件.调用时必须引用Interop.NEROLib.dll 和 Interop.NeroVisionAPI.dll 两个dll.

  • Thinkphp集成抖音SDK的实现方法

    由于抖音官方SDK相关教程太少, 所以本着 前人种树后人乘凉 的精神,写下本篇博客 第一步:下载抖音官方SDK 下载地址:抖音SDK官方下载 选择 Php下载地址 进行下载即可 第二步:将SDK导入 1.解压下载的压缩文件 2.在thinkphp项目的根目录(与application目录同级)下的extend目录下新建Douyin目录,再在Douyin目录里新建Open目录 3.将解压出来的php-sdk/douyin_open/lib目录里面的所有文件和文件夹全部复制到刚才新建的Douyin\

  • Java调用微信支付功能的方法示例代码

    Java 使用微信支付 前言百度搜了一下微信支付,都描述的不太好,于是乎打算自己写一个案例,希望以后拿来直接改造使用. 因为涉及二维码的前端显示,所以有前端的内容 一. 准备工作 所需微信公众号信息配置 APPID:绑定支付的APPID(必须配置) MCHID:商户号(必须配置) KEY:商户支付密钥,参考开户邮件设置(必须配置) APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置) 我这个案例用的是尚硅谷一位老师提供的,这里不方便提供出来,需要大家自己找,或者公司提供 二

  • jquery.Ajax()方法调用Asp.Net后台的方法解析

    利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法.先来个简单的实例热热身吧. 1.无参数的方法调用asp.net code: 复制代码 代码如下: using System.Web.Script.Services; [WebMethod]   public static string SayHello()   {        return "Hello Ajax!";   }  using System.Web.Script.Services; [WebMe

  • JS/jquery实现一个网页内同时调用多个倒计时的方法

    本文实例讲述了jquery/js实现一个网页内同时调用多个倒计时的方法.分享给大家供大家参考,具体如下: 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! var plugJs={ stamp:0, tid:1, stampnow:'<?php echo NOW_TIME;?>',//统一开始时间戳 intervalTime:function(){ if(plugJs.stamp > 0){ var day = Ma

  • python 调用win32pai 操作cmd的方法

    实例如下: #coding=utf-8 import subprocess from time import * import win32api import win32con import win32gui subprocess.Popen('C:\windows\system32\cmd.exe') sleep(1) a=65;b=66;c=67;d=68;e=69;f=70;g=71;h=72;i=73;j=74;k=75 l=76;m=77;n=78;o=79;p=80;q=81;r=8

  • Mybatis传list参数调用oracle存储过程的解决方法

    怎么利用MyBatis传List类型参数到数据库存储过程中实现批量插入数据? MyBatis中参数是List类型时怎么处理?大家都知道MyBatis批处理大量数据是很难做到事务回滚的(事务由Spring管理),都将逻辑写在存储中又是及其头疼的一件事(参数长度也有限制),那么我想的是将参数在后台封装为单个或多个list集合,直接通过MyBatis将此参数传到数据库存储过程中,一来摆脱了MyBatis批量插入数据的诸多限制(例如:不能实时返回主键.foreach标签循环集合长度有限制),二来就是在存

  • Mybatis调用视图和存储过程的方法

    现在的项目是以Mybatis作为O/R映射框架,确实好用,也非常方便项目的开发.MyBatis支持普通sql的查询.视图的查询.存储过程调用,是一种非常优秀的持久层框架.它可利用简单的XML或注解用语配置和原始映射,将接口和java中的POJO映射成数据库中的纪录. 一.调用视图 如下就是调用视图来查询收益明细,sql部分如下: <!-- 获取明细 --> <select id ="getContactEarnsDetail" resultType= "ja

  • java中利用反射调用另一类的private方法的简单实例

    我们知道,Java应用程序不能访问持久化类的private方法,但Hibernate没有这个限制,它能够访问各种级别的方法,如private, default, protected, public. Hibernate是如何实现该功能的呢?答案是利用JAVA的反射机制,如下: import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ReflectDemo {

  • iOS App中调用iPhone各种感应器的方法总结

    CoreMotion框架的使用 CoreMotion框架十分强大,它不仅将加速度传感器和螺旋仪传感器进行了统一配置和管理,还为我们封装了许多算法,我们可以直接获取到设备的运动状态信息. 1.CoreMotion负责处理的数据 CoreMotion负责处理四种数据,一种是加速度数据,一种是螺旋仪数据,一种是磁感应数据,还有一种是前三种数据通过复杂运算得到的设备的运动数据.几个主要的类如下: CMAccelerommterData:设备的加速度数据 typedef struct {     doub

随机推荐