最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#調(diào)用Nero SDK刻錄光盤的方法

 更新時(shí)間:2015年07月22日 09:53:10   作者:冰封的心  
這篇文章主要介紹了C#調(diào)用Nero SDK刻錄光盤的方法,涉及C#調(diào)用NeroCOM組件實(shí)現(xiàn)光盤刻錄的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了C#調(diào)用Nero SDK刻錄光盤的方法。分享給大家供大家參考。具體如下:

項(xiàng)目中有多光驅(qū)刻錄的需求,但在一個(gè)進(jìn)程里同時(shí)啟動(dòng)多個(gè)刻錄任務(wù),進(jìn)程經(jīng)常報(bào)異常,于是把刻錄部分單獨(dú)做了個(gè)控制臺(tái)程序,每個(gè)光驅(qū)刻錄就啟動(dòng)一個(gè)進(jìn)程去執(zhí)行刻錄任務(wù),這樣就算刻錄進(jìn)程出錯(cuò)也不會(huì)影響到父進(jìn)程。

以下是Nero 刻碟的類,SDK采用NeroSDK-1.08版本,調(diào)用NeroCOM組件。調(diào)用時(shí)必須引用Interop.NEROLib.dll 和 Interop.NeroVisionAPI.dll 兩個(gè)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 構(gòu)造函數(shù)
  /// <summary></summary>
  /// 構(gòu)造函數(shù)
  /// 
  /// <param name="driverletter">盤符
  /// <param name="burnpath">待刻錄的文件路徑
  /// <param name="discvol">盤的卷標(biāo)
  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>
  /// 發(fā)起刻錄事件
  /// 
  /// <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 + "盤卷標(biāo)為 " + m_discvol + " 刻錄成功!!");
   }
   else
   {
    m_returnCode = 0;
    Console.WriteLine(m_neroDerive.DriveLetter + "盤卷標(biāo)為 " + m_discvol + " 刻錄失敗!!");
   }
   m_isDoneBurn = true;
   Console.WriteLine("Burn Finish!!");
  }
  /// <summary></summary>
  /// 如果光驅(qū)為空,等待光驅(qū)
  /// 
  /// <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 申請(qǐng)?jiān)O(shè)備
  /// <summary></summary>
  /// 申請(qǐng)?jiān)O(shè)備
  /// 
  /// <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:未知錯(cuò)誤
  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);
    //循環(huán)執(zhí)行,等待刻錄完成
    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 輔助函數(shù)
  /// <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 + "http://");
    }
   }
   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函數(shù)中調(diào)用NeroBurn類的方法,Main函數(shù)的參數(shù)如下:

static int Main(string[] args) 
{ 
   string driverletter; //驅(qū)動(dòng)器盤符,含':'號(hào) 
   string burnpath;  //刻錄文件目錄 
   string discvol;  //光盤卷標(biāo) 
   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;

希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • C#集合遍歷時(shí)刪除和增加元素的方法

    C#集合遍歷時(shí)刪除和增加元素的方法

    這篇文章主要介紹了C#集合遍歷時(shí)刪除和增加元素的方法,結(jié)合實(shí)例形式分析了C#針對(duì)集合元素的遍歷、添加與刪除等操作實(shí)現(xiàn)方法與注意事項(xiàng),需要的朋友可以參考下
    2016-06-06
  • 仿orm自動(dòng)生成分頁SQL分享

    仿orm自動(dòng)生成分頁SQL分享

    平時(shí)接觸的數(shù)據(jù)庫有sql2000-2008,Oracle,SQLite 。 分頁邏輯,Oracle和SQLite相對(duì)好寫,就SQL事多,Sql2000下只能用top,排序2次,而Sql2005+就可以使用ROW_NUMBER()分析函數(shù)了,據(jù)說Sql2012對(duì)分頁又有了改進(jìn)
    2014-01-01
  • C#中Lambda表達(dá)式的三種寫法

    C#中Lambda表達(dá)式的三種寫法

    這篇文章介紹了C#中Lambda表達(dá)式的三種寫法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C#之Expression表達(dá)式樹實(shí)例

    C#之Expression表達(dá)式樹實(shí)例

    這篇文章主要介紹了C#之Expression表達(dá)式樹,包括了表達(dá)式樹的原理與用法技巧,需要的朋友可以參考下
    2014-10-10
  • c#中(&&,||)與(&,|)的區(qū)別詳解

    c#中(&&,||)與(&,|)的區(qū)別詳解

    這篇文章主要介紹了c#中(&&,||)與(&,|)的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 深入理解C#中的枚舉

    深入理解C#中的枚舉

    本篇文章主要是對(duì)C#中的枚舉進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2014-01-01
  • 算法基礎(chǔ)之算法設(shè)計(jì)與分析

    算法基礎(chǔ)之算法設(shè)計(jì)與分析

    這篇文章主要介紹了算法基礎(chǔ)之算法設(shè)計(jì)與分析,貪心算法是一種解決優(yōu)化問題的算法設(shè)計(jì)方法,其核心思想是在每一步選擇當(dāng)前狀態(tài)下的最優(yōu)解,從而希望最終達(dá)到全局最優(yōu)解,需要的朋友可以參考下
    2023-10-10
  • C#編程實(shí)現(xiàn)四舍五入、向上及下取整的方法

    C#編程實(shí)現(xiàn)四舍五入、向上及下取整的方法

    這篇文章主要介紹了C#編程實(shí)現(xiàn)四舍五入、向上及下取整的方法,涉及C#數(shù)學(xué)運(yùn)算的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • C# PLINQ 內(nèi)存列表查詢優(yōu)化歷程

    C# PLINQ 內(nèi)存列表查詢優(yōu)化歷程

    這篇文章主要介紹了C# PLINQ 內(nèi)存列表查詢優(yōu)化歷程的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • C#設(shè)置軟件開機(jī)自動(dòng)運(yùn)行的方法(修改注冊(cè)表)

    C#設(shè)置軟件開機(jī)自動(dòng)運(yùn)行的方法(修改注冊(cè)表)

    這篇文章主要介紹了C#設(shè)置軟件開機(jī)自動(dòng)運(yùn)行的方法,通過簡單修改注冊(cè)表開機(jī)啟動(dòng)項(xiàng)實(shí)現(xiàn)軟件的開機(jī)啟動(dòng)功能,非常簡單實(shí)用,需要的朋友可以參考下
    2016-06-06

最新評(píng)論

洛宁县| 涡阳县| 洮南市| 霍山县| 昌图县| 涟源市| 诸城市| 盐亭县| 木里| 岗巴县| 清流县| 麻江县| 阜平县| 固阳县| 女性| 天门市| 神木县| 宣化县| 禄丰县| 廉江市| 阿城市| 攀枝花市| 航空| 慈利县| 喀什市| 和田县| 梁河县| 徐闻县| 清新县| 莱州市| 汽车| 沙坪坝区| 石屏县| 广平县| 淄博市| 明光市| 文安县| 枝江市| 汉沽区| 桦南县| 南皮县|