C#調(diào)用Nero SDK刻錄光盤(pán)的方法
本文實(shí)例講述了C#調(diào)用Nero SDK刻錄光盤(pán)的方法。分享給大家供大家參考。具體如下:
項(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 刻碟的類(lèi),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">盤(pán)符 /// <param name="burnpath">待刻錄的文件路徑 /// <param name="discvol">盤(pán)的卷標(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("光盤(pán)" + 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 + "盤(pán)卷標(biāo)為 " + m_discvol + " 刻錄成功!!"); } else { m_returnCode = 0; Console.WriteLine(m_neroDerive.DriveLetter + "盤(pán)卷標(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> /// 寫(xiě)日志 /// /// <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類(lèi)的方法,Main函數(shù)的參數(shù)如下:
static int Main(string[] args) { string driverletter; //驅(qū)動(dòng)器盤(pán)符,含':'號(hào) string burnpath; //刻錄文件目錄 string discvol; //光盤(pán)卷標(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)文章
使用checked語(yǔ)句防止數(shù)據(jù)溢出的解決方法
本篇文章是對(duì)用checked語(yǔ)句防止數(shù)據(jù)溢出的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05WinForm中KeyDown,KeyPress和KeyUp的順序與區(qū)別解析
這篇文章主要介紹了WinForm中KeyDown,KeyPress和KeyUp的順序與區(qū)別解析,對(duì)C#初學(xué)者來(lái)說(shuō)很有學(xué)習(xí)借鑒價(jià)值,需要的朋友可以參考下2014-08-08C#線程開(kāi)發(fā)之System.Thread類(lèi)詳解
本文詳細(xì)講解了C#線程開(kāi)發(fā)之System.Thread類(lèi),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05C#命令行參數(shù)解析庫(kù)System.CommandLine使用
System.CommandLine是一個(gè)基于.Net Standard 2.0的命令行參數(shù)解析庫(kù),該項(xiàng)目還是屬于beta狀態(tài),期待以后的正式版本,文章通過(guò)示例代碼給大家介紹了System.CommandLine使用講解,感興趣的朋友一起看看吧2021-06-06c#?如何將字符串轉(zhuǎn)換為大寫(xiě)或小寫(xiě)
這篇文章主要介紹了c#?如何將字符串轉(zhuǎn)換為大寫(xiě)或小寫(xiě),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06