C#调用Nero SDK刻录光盘的方法
本文实例讲述了C#调用NeroSDK刻录光盘的方法。分享给大家供大家参考。具体如下:
项目中有多光驱刻录的需求,但在一个进程里同时启动多个刻录任务,进程经常报异常,于是把刻录部分单独做了个控制台程序,每个光驱刻录就启动一个进程去执行刻录任务,这样就算刻录进程出错也不会影响到父进程。
以下是Nero刻碟的类,SDK采用NeroSDK-1.08版本,调用NeroCOM组件。调用时必须引用Interop.NEROLib.dll和Interop.NeroVisionAPI.dll两个dll。
publicclassNeroBurn
{
#region属性
privateNeroDrivem_neroDerive;
privateNerom_nero;
privateboolm_aborted;
privatestringm_burnPath;
privateboolm_isDoneBurn;
privateintm_returnCode;//0:失败;1:成功;-1:未知
privatestringm_discvol;
//nero委托
private_INeroDriveEvents_OnDoneBurnEventHandlerm_evOnDoneBurn;
private_INeroDriveEvents_OnAddLogLineEventHandlerm_evOnAddLogLine;
private_INeroEvents_OnWaitCDEventHandlerm_evOnWaitCD;
private_INeroDriveEvents_OnAbortedEventHandlerm_evOnAborted;
private_INeroDriveEvents_OnProgressEventHandlerm_evOnProgress;
private_INeroEvents_OnWaitCDDoneEventHandlerm_evOnWaitCDDone;
#endregion
#region构造函数
///<summary></summary>
///构造函数
///
///<paramname="driverletter">盘符
///<paramname="burnpath">待刻录的文件路径
///<paramname="discvol">盘的卷标
publicNeroBurn(stringdriverletter,stringburnpath,stringdiscvol)
{
m_burnPath=burnpath;
m_nero=newNeroClass();
m_neroDerive=allocDevice(driverletter);
m_aborted=false;
m_isDoneBurn=false;
m_discvol=discvol;
}
#endregion
#regionNero事件处理
///<summary></summary>
///发起刻录事件
///
///<paramname="bSubscribe">
privatevoidSubscribeToEvents(boolbSubscribe)
{
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;
}
}
privatevoidm_drive_OnProgress(refintProgressInPercent,refboolAbort)
{
//Thiseventsgivesusanopportunitytoshowprogress
//aswellasabortifneeded.
//
Abort=m_aborted;
Console.WriteLine("光盘"+m_discvol+""+ProgressInPercent.ToString()+"%hadBurned!!");
//c_TaskPercent.Text=ProgressInPercent.ToString()+"%";
}
privatevoidm_nero_OnWaitCDDone()
{
//Whenwaitingonadiscisdone,makesureto
//enableusandhidetheWaitCDform.
//
Console.WriteLine("aDischasinserted!");
}
///<summary></summary>
///刻录完成,不管失败成功!
///
///<paramname="StatusCode">
privatevoidm_drive_OnDoneBurn(refNERO_BURN_ERRORStatusCode)
{
//Whenburningisover,makesuretounsubscribefromall
//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("BurnFinish!!");
}
///<summary></summary>
///如果光驱为空,等待光驱
///
///<paramname="WaitCD">
///<paramname="WaitCDLocalizedText">
privatevoidm_nero_OnWaitCD(refNERO_WAITCD_TYPEWaitCD,refstringWaitCDLocalizedText)
{
Console.WriteLine("WaitCD...");
}
///<summary></summary>
///写日志
///
///<paramname="TextType">
///<paramname="Text">
privatevoidm_drive_OnAddLogLine(refNERO_TEXT_TYPETextType,refstringText)
{
Console.WriteLine(Text);
}
#endregion
#region申请设备
///<summary></summary>
///申请设备
///
///<paramname="driverletter">
///<returns></returns>
privateNeroDriveallocDevice(stringdriverletter)
{
NeroDrivesdrives=m_nero.GetDrives(NERO_MEDIA_TYPE.NERO_MEDIA_DVD_M);
if(drives.Count>0)
{
foreach(NeroDrivedindrives)
{
if(driverletter.ToLower().Contains(d.DriveLetter.ToLower()))
returnd;
}
}
returnnull;
}
#endregion
#region刻录
///<summary></summary>
///刻录
///
///<returns></returns>0:失败;1:成功;-1:未知错误
publicintBurn()
{
m_isDoneBurn=false;
SubscribeToEvents(true);
NeroISOTrackisoTrack=newNeroISOTrackClass();
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("BeginAddFilesAndFoldersToISOTrack.");
AddFilesAndFoldersToISOTrack(refisoTrack,m_burnPath);
Console.WriteLine("EndAddFilesAndFoldersToISOTrack.");
if(isoTrack.RootFolder.Files.Count==0&&
isoTrack.RootFolder.Folders.Count==0)
{
isoTrack=null;
return0;
}
NERO_BURN_FLAGSflags=newNERO_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_neroDeriveisnull!!");
return-1;
}
intspeed=10000;
stringBurnSpeed_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)//如果刻录完成
returnm_returnCode;
System.Threading.Thread.Sleep(1000);
}
}
catch(Exceptione)
{
m_aborted=true;
Console.WriteLine("BurnError:"+e.Message);
return0;
}
return-1;
}
#endregion
#region辅助函数
///<summary></summary>
///ThisfunctionaddsthefilesandfolderstothesuppliedNeroISOTrack.
///AddbyCola2008-4-14
///
///<paramname="isoTrack">
///<paramname="discPath">
privatevoidAddFilesAndFoldersToISOTrack(refNeroISOTrackisoTrack,stringdiscPath)
{
stringsPath=discPath;
//Thestringshouldreallynotbeempty...
//
if(sPath!="")
{
//Ifpathendsinabackslash,itisafolder.
//
if(sPath[sPath.Length-1]=='//')
{
NeroFolderfolder=isoTrack.RootFolder;
AddFolderRecursively(reffolder,sPath);
}
else
{
//Thisisafile.CreateanewNeroFile
//changeitsproperties.
//
NeroFilefile=newNeroFileClass();
file.SourceFilePath=sPath;
file.Name=Path.GetFileName(sPath);
file.EntryTime=Directory.GetLastWriteTime(sPath);
//Inthisimplementation,specifiedfilesareadded
//totherootofthedisconly.
//
isoTrack.RootFolder.Files.Add(file);
}
}
}
///<summary></summary>
///Thisfunctionisusedtorecursivelyaddthepathtothesupplied
///parentNeroFolder.AddbyCola2008-4-14
///
///<paramname="folderParent">
///<paramname="sPath">
privatevoidAddFolderRecursively(refNeroFolderfolderParent,stringsPath)
{
NeroFolderfolder=newNeroFolderClass();
folderParent.Folders.Add(folder);
string[]sSplits=sPath.Split(newchar[]{'//'},sPath.Length);
if(sSplits.GetLength(0)>=2)
{
stringsFolderName=sSplits[sSplits.GetLength(0)-2];
folder.Name=sFolderName;
string[]sDirectories=Directory.GetDirectories(sPath);
foreach(stringsSubDirPathinsDirectories)
{
AddFolderRecursively(reffolder,sSubDirPath+"//");
}
}
string[]sFiles=Directory.GetFiles(sPath);
foreach(stringsFileinsFiles)
{
NeroFilefile=newNeroFileClass();
file.SourceFilePath=sFile;
file.Name=Path.GetFileName(sFile);
file.EntryTime=Directory.GetLastWriteTime(sFile);
folder.Files.Add(file);
}
}
#endregion
}
然后,在Main函数中调用NeroBurn类的方法,Main函数的参数如下:
staticintMain(string[]args)
{
stringdriverletter;//驱动器盘符,含':'号
stringburnpath;//刻录文件目录
stringdiscvol;//光盘卷标
if(args.Length==3)
{
driverletter=args[0];
burnpath=args[1];
discvol=args[2];
NeroBurnb=newNeroBurn(driverletter,burnpath,discvol);
intret=b.Burn();
returnret;
}
return-1;
希望本文所述对大家的C#程序设计有所帮助。