最近公司提出一个需求,要把公司系统的图像刻录成光盘(公司系统是医院放射科系统,很多放射科的图像)
查看了很多资料发现有两个比较可靠
1:使用IMAPI2,进行文件的光盘刻录,具体实例可以参照以下链接:
C#实现方式:
Burning and Erasing CD/DVD Media with C# and IMAPI2
地址:http://www.codeproject.com/Articles/24544/Burning-and-Erasing-CD-DVD-Blu-ray-Media-with-C-an
C++实现方式:
Burning CD/DVD Media with the Image Mastering API Version 2.0 (IMAPI2)
地址:http://www.codeproject.com/Articles/22538/Burning-CD-DVD-Media-with-the-Image-Mastering-API
我用的C#的版本,经过测试 在WIN7下好用,xp 下不好用, 虽然很多人说xp sp3补丁可以,但是我还是失败了,公司的系统要求Xp可以使用
而且有个奇怪的问题,我自定义的项目就没有进度条的事件,下载老外的源码就有,好奇怪
郁闷呀..
2:C#调用Nero SDK进行
参考资料:1.http://blog.sina.com.cn/s/blog_962aaf5d01012vow.html
2.http://blog.csdn.net/laibeikele/article/details/2500185
这两位写的都很完全,我只是把它收集补充了一下
首先是
SDK的版本: 采用NeroSDK-1.08版本,
Nero版本: 你的电脑需要安装Nero, 应该是必须要Nero7, 我安装了8不好用,只有安装7才好用
开发注意:.net版本应该是1.0到3.5之间.4.0,4.5编译不了,而且项目的目标平台必须是x86 其他的会报错
基于Nero SDK有我自己的一个简单的封装,帖出来给大家分享一下
项目结构
系统定义部分委托:
/// <summary>
/// 显示时间进度
/// </summary>
/// <param name="time"></param>
public delegate void ShowTimeProcessDelegate(string time);
/// <summary>
/// 显示进度
/// </summary>
/// <param name="percentProgress"></param>
public delegate void ShowBrushLogLineDelegate(string value);
/// <summary>
/// 显示进度
/// </summary>
/// <param name="percentProgress"></param>
public delegate void ShowBrushProcessDelegate(ProcessEntity percentEvent);
/// <summary>
/// 刻录错误
/// </summary>
/// <param name="error"></param>
public delegate void BurshErrorDelegate(Exception ex);
/// <summary>
/// 刻录成功
/// </summary>
/// <param name="value"></param>
public delegate void BrushSuccessDelegate(string value);
/// <summary>
/// 显示光盘信息
/// </summary>
/// <returns></returns>
public delegate void ShowDiscInfoDelegate(DiscInfoEntity disc);
/// <summary>
/// 获取所以刻录信息
/// </summary>
/// <param name="collection"></param>
public delegate void GetSpeedEntityCollectionDelegate(SpeedEntityCollection collection);
获取光盘信息方法
/// <summary>
/// 光盘信息帮助类
/// </summary>
class DiscHelper
{
private Nero m_nero;
private NeroDrive m_drive;
internal event ShowDiscInfoDelegate ShowDisc;
public DiscHelper(Nero nero, NeroDrive drive)
{
this.m_nero = nero;
this.m_drive = drive;
}
/// <summary>
/// 获取光盘容量
/// </summary>
/// <param name="driveInfo">驱动器信息</param>
/// <returns></returns>
public void GetDriveInfoSize()
{
if (m_drive != null)
{
m_drive.OnDoneCDInfo += drive_OnDoneCDInfo;
}
RefreshDiscInfo();
}
private void RefreshDiscInfo()
{
if (m_drive != null)
{
m_drive.CDInfo(NERO_CDINFO_FLAGS.NERO_READ_CD_TEXT);
}
}
/// <summary>
/// 异步触发信息类
/// </summary>
/// <param name="pCDInfo"></param>
private void drive_OnDoneCDInfo(INeroCDInfo pCDInfo)
{
m_drive.OnDoneCDInfo -= drive_OnDoneCDInfo;
DisplayDiscInfo((NeroCDInfo)pCDInfo);
}
/// <summary>
/// 格式化光盘信息实体类
/// </summary>
/// <param name="cdinfo"></param>
private void DisplayDiscInfo(NeroCDInfo cdinfo)
{
DiscInfoEntity info = null;
if (cdinfo != null)
{
info = new DiscInfoEntity();
long l2048 = 2048;//2048转换成long类型
info.MediaType = m_nero.get_TypeNameOfMedia(cdinfo.MediaType);
info.StrFreeCapacity = BlockToByte(cdinfo.FreeCapacityInBlocks);
info.StrUnused = BlockToByte((uint)cdinfo.UnusedBlocks);
info.StrTotalCapacity = BlockToByte(cdinfo.TotalCapacity);
info.TotalCapacity = cdinfo.FreeCapacityInBlocks * l2048;
info.Unused = ((uint)cdinfo.UnusedBlocks) * l2048;
info.TotalCapacity = cdinfo.TotalCapacity * l2048;
info.Cdinfo = cdinfo;
}
//委托返回信息
if (ShowDisc != null)
{
ShowDisc(info);
}
}
#region 格式化函数
private string BlockToByte(int block)
{
string Value = string.Empty;
int temp = FromByteM(block);
if (temp < 1024)
{
Value = string.Format("{0}MB", temp);
}
else
{
Value = string.Format("{0:N}GB", FromByteG(block));
}
return Value;
}
private string BlockToByte(uint block)
{
string Value = string.Empty;
int temp = FromByteM(block);
if (temp < 1024)
{
Value = string.Format("{0}MB", temp);
}
else
{
Value = string.Format("{0:N}GB", FromByteG(block));
}
return Value;
}
/// <summary>
/// Block转换MB
/// </summary>
/// <param name="block"></param>
/// <returns></returns>
private int FromByteM(int block)
{
int temp = block * 2 / 1024;
return temp;
}
/// <summary>
/// Block转换MB
/// </summary>
/// <param name="block"></param>
/// <returns></returns>
private int FromByteM(uint block)
{
uint ut1 = 2;
uint ut2 = 1024;
int temp = (int)(block * ut1 / ut2);
return temp;
}
/// <summary>
/// Block转换GB
/// </summary>
/// <param name="block"></param>
/// <returns></returns>
private double FromByteG(int block)
{
double d1 = (double)block;
double temp = d1 * 2 / 1024 / 1024;
return temp;
}
/// <summary>
/// Block转换GB
/// </summary>
/// <param name="block"></param>
/// <returns></returns>
private double FromByteG(uint block)
{
uint ut1 = 2;
uint ut2 = 1024;
double d1 = (double)block;
double temp = (double)(d1 * ut1 / ut2 / ut2);
return temp;
}
#endregion
}
有一部分是block转换使用的.SDK获取到的并不在我们常用的单位
光盘信息定义的实体类
/// <summary>
/// 光盘信息实体类
/// </summary>
public class DiscInfoEntity
{
/// <summary>
/// 剩余容量(带单位)
/// </summary>
public string StrFreeCapacity { get; set; }
/// <summary>
/// 不可用容量(带单位)
/// </summary>
public string StrUnused { get; set; }
/// <summary>
/// 全部容量(带单位)
/// </summary>
public string StrTotalCapacity { get; set; }
/// <summary>
/// 剩余容量Byte
/// </summary>
public long FreeCapacity { get; set; }
/// <summary>
/// 已用容量Byte
/// </summary>
public long Unused { get; set; }
/// <summary>
/// 全部容量
/// </summary>
public long TotalCapacity { get; set; }
/// <summary>
/// 光盘类型
/// </summary>
public string MediaType { get; set; }
/// <summary>
///
/// </summary>
public NeroCDInfo Cdinfo { get; set; }
}
2:获取刻录机的读写速度
/// <summary>
/// 刻录速度帮助类
/// </summary>
class SpeedHelper
{
public NeroDrive m_drive;
private bool m_bWriteSpeeds;
private _INeroDriveEvents_OnDoneCDInfoEventHandler m_evOnDoneCDInfo;
internal event GetSpeedEntityCollectionDelegate GetSpeedCollect;
public SpeedHelper(NeroDrive drive, bool writeSpeed)
{
m_drive = drive;
m_bWriteSpeeds = writeSpeed;