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