private static void A2lDetailData(string targetPath, RadGridView gridView, GridViewData listData) { try { lock (obj) { StringBuilder _segmentStr = new StringBuilder(); StringBuilder _10msStr = new StringBuilder(); StringBuilder _100msStr = new StringBuilder(); //定义XCP时间分类限制数组名 _segmentHeadName = HEADER_NAME + FUN_TYPE + SEGMENT_NAME + _A2L_ARRAY_CHAR + _SPLIT_CHAR; _10msHeadName = HEADER_NAME + FUN_TYPE + _10MS_NAME + _A2L_ARRAY_CHAR + _SPLIT_CHAR; _100msHeadName = HEADER_NAME + FUN_TYPE + _100MS_NAME + _A2L_ARRAY_CHAR + _SPLIT_CHAR; if (listData.LimitTimeListSegMent.Count > 0) { //添加头 _segmentStr.Append(_segmentHeadName); //添加数据 AppendData(listData.LimitTimeListSegMent, _segmentStr, gridView); } if (listData.LimitTimeList10ms.Count > 0) { _10msStr.Append(_10msHeadName); AppendData(listData.LimitTimeList10ms, _10msStr, gridView); } if (listData.LimitTimeList100ms.Count > 0) { _100msStr.Append(_100msHeadName); AppendData(listData.LimitTimeList100ms, _100msStr, gridView); } //写入数据 if (_segmentStr.Length > 0) { WriteData.WriteString(_segmentStr, targetPath); } if (_10msStr.Length > 0) { WriteData.WriteString(_10msStr, targetPath); } if (_100msStr.Length > 0) { WriteData.WriteString(_100msStr, targetPath); } } } catch (Exception ex) { LogHelper.Log.Error(ex.Message + "\r\n" + ex.StackTrace); } }
private static void DbcDetailData(string targetPath, RadGridView gridView, GridViewData listData) { try { //遍历行数据 StringBuilder dbcBuilder = new StringBuilder(); acturalDBCList = new List <AnalysisSignal>(); frameIdList = new List <string>(); allDbcGroupData = new List <StringBuilder>(); //遍历选择行数据 List <AnalysisSignal> analysisDbcDataList = DbcDataToSignal(listData, gridView); //根据分组ID查询该ID对应所有数据行 for (int i = 0; i < frameIdList.Count; i++) { var resdbcList = acturalDBCList.FindAll(dbc => dbc.DataAddress == frameIdList[i]); StringBuilder dbcGroupData = new StringBuilder(); dbcGroupData.Append(DBC_DETAIL_HEAD); string metholdName = DBC_DEATIL_METHOLD_NAME + "_" + frameIdList[i]; dbcGroupData.AppendLine(metholdName + "[] = \r\n{ "); //保存格式内容:名称+描述+单位+数据类型+数据长度+字节顺序+截取开始地址(dbc有用)+截取长度+数据地址(a2l-ecu地址,monitor-canid)+系数+偏移量 for (int j = 0; j < resdbcList.Count; j++) { dbcGroupData.Append("\t\t" + '"' + resdbcList[j].Name + '"' + ","); var dbcMsg = analysisDbcDataList.Find(dbc => dbc.DataAddress == resdbcList[j].DataAddress); dbcGroupData.Append('"' + dbcMsg.Describle + '"' + ","); dbcGroupData.Append('"' + resdbcList[j].Unit + '"' + ","); dbcGroupData.Append(resdbcList[j].SaveDataType + ","); dbcGroupData.Append(resdbcList[j].SaveDataLen + ","); dbcGroupData.Append(resdbcList[j].IsMotorola + ","); dbcGroupData.Append(resdbcList[j].StartIndex + ","); dbcGroupData.Append(resdbcList[j].DataBitLen + ","); dbcGroupData.Append(resdbcList[j].DataAddress + ","); dbcGroupData.Append(resdbcList[j].Factor + ","); dbcGroupData.AppendLine(resdbcList[j].OffSet + ","); } dbcGroupData.AppendLine("};"); LogHelper.Log.Info("DBC开始写入数据!"); allDbcGroupData.Add(dbcGroupData); LogHelper.Log.Info("DBC写数据完成!"); } //写数据 WriteData.WriteString(allDbcGroupData, targetPath); } catch (Exception ex) { LogHelper.Log.Info(ex.Message + ex.StackTrace); } }
private static void AddDBCDetailGroup(string targPath) { StringBuilder sbExInfo = new StringBuilder(); sbExInfo.Append(EXINFO_TYPE_HEAD); sbExInfo.AppendLine(EXINFO_FUN_NAME_CAN2 + EXINFO_TYPE_METHOLD_NAME); //sbExInfo.AppendLine("\t\t0" + "," + "0" + "," + "0" + ","); //sbExInfo.AppendLine("\t\t1" + "," + "0" + "," + "0" + ","); for (int i = 0; i < frameIdList.Count; i++) { var resdbcList = acturalDBCList.FindAll(dbc => dbc.DataAddress == frameIdList[i]); string metholdName = DBC_DEATIL_METHOLD_NAME + "_" + frameIdList[i]; sbExInfo.AppendLine($"\t\t{(int)ExInfoType.MORNITOR_TAB_TYPE},(uint32_t){metholdName},{resdbcList.Count},"); } sbExInfo.AppendLine("};"); WriteData.WriteString(sbExInfo, targPath); }
/// <summary> /// 导出a2l与dbc文件到本地 /// </summary> public static void ExportCanFile(string targetPath, string excutePath, GridExportContent gridExportContent) { //判断是否选择CAN //选择CAN后是否有数据 //有数据后,是否有选择要执行的行 stringBuilderHead = new StringBuilder(); File.Delete(targetPath); stringBuilderHead.AppendLine($"#include\"datatype.h\""); WriteData.WriteString(stringBuilderHead, targetPath); if (gridExportContent.CurrentSelectCanType == CurrentCanType.CAN1) { //是否加载数据 if (gridExportContent.GridViewCan1.RowCount < 1) { MessageBox.Show("CAN1通道没有可导出的数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); File.Delete(targetPath); return; } //是否选择数据 if (gridExportContent.AgreementTypeCan1 == AgreementType.CCP || gridExportContent.AgreementTypeCan1 == AgreementType.XCP) { //判断CAN1是否有数据 if (gridExportContent.GridDataA2lSelectRow.LimitTimeList10ms.Count < 1 && gridExportContent.GridDataA2lSelectRow.LimitTimeList100ms.Count < 1) { MessageBox.Show("CAN1通道未选择导出数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); File.Delete(targetPath); return; } ExportXCP(targetPath, gridExportContent.GridViewCan1, gridExportContent.GridDataA2lSelectRow, gridExportContent.XcpDataCan1); } else if (gridExportContent.AgreementTypeCan1 == AgreementType.DBC) { if (gridExportContent.GridDataDbcSelectRow.DbcCheckIndex.Count < 1) { MessageBox.Show("CAN1通道未选择导出数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); File.Delete(targetPath); return; } ExportDBC(targetPath, gridExportContent.GridViewCan1, gridExportContent.GridDataDbcSelectRow, gridExportContent.XcpDataCan1, gridExportContent.AnalysisDataCan1); } } else if (gridExportContent.CurrentSelectCanType == CurrentCanType.CAN2) { //是否有数据 if (gridExportContent.GridViewCan2.RowCount < 1) { MessageBox.Show("CAN2通道没有可导出的数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); File.Delete(targetPath); return; } //是否选择数据 if (gridExportContent.AgreementTypeCan2 == AgreementType.CCP || gridExportContent.AgreementTypeCan2 == AgreementType.XCP) { //判断CAN2是否有数据 if (gridExportContent.GridDataA2lSelectRow.LimitTimeList10ms.Count < 1 && gridExportContent.GridDataA2lSelectRow.LimitTimeList100ms.Count < 1) { MessageBox.Show("CAN2通道未选择导出数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); File.Delete(targetPath); return; } ExportXCP(targetPath, gridExportContent.GridViewCan2, gridExportContent.GridDataA2lSelectRow, gridExportContent.XcpDataCan2); } else if (gridExportContent.AgreementTypeCan2 == AgreementType.DBC) { if (gridExportContent.GridDataDbcSelectRow.DbcCheckIndex.Count < 1) { MessageBox.Show("CAN2通道未选择导出数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); File.Delete(targetPath); return; } ExportDBC(targetPath, gridExportContent.GridViewCan2, gridExportContent.GridDataDbcSelectRow, gridExportContent.XcpDataCan2, gridExportContent.AnalysisDataCan2); } } else if (gridExportContent.CurrentSelectCanType == CurrentCanType.CAN1_CAN2) { //是否有数据 if (gridExportContent.GridViewCan1.RowCount < 1) { MessageBox.Show("CAN1通道没有可导出的数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); File.Delete(targetPath); return; } if (gridExportContent.GridViewCan2.RowCount < 1) { MessageBox.Show("CAN2通道没有可导出的数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); File.Delete(targetPath); return; } //是否选择数据 if (gridExportContent.AgreementTypeCan1 == AgreementType.CCP || gridExportContent.AgreementTypeCan1 == AgreementType.XCP) { //判断CAN1是否选择数据 if (gridExportContent.GridDataA2lSelectRow.LimitTimeList10ms.Count < 1 && gridExportContent.GridDataA2lSelectRow.LimitTimeList100ms.Count < 1) { MessageBox.Show("CAN1通道未选择导出数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); File.Delete(targetPath); return; } if (gridExportContent.AgreementTypeCan2 == AgreementType.CCP || gridExportContent.AgreementTypeCan2 == AgreementType.XCP) { if (gridExportContent.GridDataA2lSelectRow.LimitTimeList10ms.Count < 1 && gridExportContent.GridDataA2lSelectRow.LimitTimeList100ms.Count < 1) { MessageBox.Show("CAN2通道未选择导出数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); File.Delete(targetPath); return; } //xcp+xcp待验证 ExportXCP(targetPath, gridExportContent.GridViewCan1, gridExportContent.GridDataA2lSelectRow, gridExportContent.XcpDataCan1); ExportXCP(targetPath, gridExportContent.GridViewCan2, gridExportContent.GridDataDbcSelectRow, gridExportContent.XcpDataCan2); } else if (gridExportContent.AgreementTypeCan2 == AgreementType.DBC) { if (gridExportContent.GridDataDbcSelectRow.DbcCheckIndex.Count < 1) { MessageBox.Show("CAN2通道未选择导出数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); File.Delete(targetPath); return; } ExportDBCXCP(targetPath, gridExportContent); } } else if (gridExportContent.AgreementTypeCan1 == AgreementType.DBC) { //判断CAN1是否有选择数据 if (gridExportContent.GridDataDbcSelectRow.DbcCheckIndex.Count < 1) { MessageBox.Show("CAN1通道未选择导出数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); File.Delete(targetPath); return; } if (gridExportContent.AgreementTypeCan2 == AgreementType.CCP || gridExportContent.AgreementTypeCan2 == AgreementType.XCP) { if (gridExportContent.GridDataA2lSelectRow.LimitTimeList10ms.Count < 1 && gridExportContent.GridDataA2lSelectRow.LimitTimeList100ms.Count < 1) { MessageBox.Show("CAN2通道未选择导出数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); File.Delete(targetPath); return; } ExportDBCXCP(targetPath, gridExportContent); } else if (gridExportContent.AgreementTypeCan2 == AgreementType.DBC) { if (gridExportContent.GridDataDbcSelectRow.DbcCheckIndex.Count < 1) { MessageBox.Show("CAN2通道未选择导出数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); File.Delete(targetPath); return; } //待验证 ExportDBC(targetPath, gridExportContent.GridViewCan1, gridExportContent.GridDataDbcSelectRow, gridExportContent.XcpDataCan1, gridExportContent.AnalysisDataCan1); ExportDBC(targetPath, gridExportContent.GridViewCan2, gridExportContent.GridDataDbcSelectRow, gridExportContent.XcpDataCan2, gridExportContent.AnalysisDataCan2); } } } else { //未选择CAN MessageBox.Show("没有可导出的数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } //导出完成后执行.bat //var batName = ConfigurationManager.AppSettings["batName"].ToString(); //if (batName == "") // batName = "xcpmake.bat"; //if (!File.Exists(excutePath + batName)) // return ; //var executeResult = true;//= Execute.ExecuteApply(excutepath, batName); //if (executeResult) //{ // if (MessageBox.Show("已成功生成DLL,是否打开DLL路径!", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK) // { // System.Diagnostics.Process.Start(excutePath);//仅打开文件目录 // //System.Diagnostics.Process.Start("Explorer", "/select," + excutepath + "\\" + batName);//打开目录,定位文件 // } //} //else //{ // MessageBox.Show("生成DLL失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); //} }
private static void AddCanChInfo(string targPath, XcpData xcpData, AnalysisData analysisData, ProtocolType protocolType) { string infoHead = "CanChInfo INFO[2] = \r\n{"; StringBuilder sb = new StringBuilder(); sb.AppendLine(infoHead); if (protocolType == ProtocolType.XCP_CCP) { if (xcpData.AgreeMentType == AgreementType.CCP) { sb.AppendLine($"\t{(int)ExportProtocolType.CCP_OPEN},{xcpData.IF_DATA_ASAP1B_CCP_DATA.BAUDRATE},(uint32_t){EXINFO_FUN_NAME_CAN1},{exInfoLen},"); } else if (xcpData.AgreeMentType == AgreementType.XCP) { if (xcpData.XcpOnCanData.CurrentSelectItem == xcpData.XcpOnCanData.VehicleApplData.CanName) { sb.AppendLine($"\t{(int)ExportProtocolType.XCP_OPEN},{xcpData.XcpOnCanData.VehicleApplData.Baudrate},(uint32_t){EXINFO_FUN_NAME_CAN1},{exInfoLen},"); } else if (xcpData.XcpOnCanData.CurrentSelectItem == xcpData.XcpOnCanData.VehicleApplRamData.CanName) { sb.AppendLine($"\t{(int)ExportProtocolType.XCP_OPEN},{xcpData.XcpOnCanData.VehicleApplRamData.Baudrate},(uint32_t){EXINFO_FUN_NAME_CAN1},{exInfoLen},"); } else if (xcpData.XcpOnCanData.CurrentSelectItem == xcpData.XcpOnCanData.CalibrationLeData.CanName) { sb.AppendLine($"\t{(int)ExportProtocolType.XCP_OPEN},{xcpData.XcpOnCanData.CalibrationLeData.Baudrate},(uint32_t){EXINFO_FUN_NAME_CAN1},{exInfoLen},"); } else if (xcpData.XcpOnCanData.CurrentSelectItem == xcpData.XcpOnCanData.CalibrationLeRamData.CanName) { sb.AppendLine($"\t{(int)ExportProtocolType.XCP_OPEN},{xcpData.XcpOnCanData.CalibrationLeRamData.Baudrate},(uint32_t){EXINFO_FUN_NAME_CAN1},{exInfoLen},"); } } sb.AppendLine($"\t{0},{0},{0},{0},"); } else if (protocolType == ProtocolType.DBC) { sb.AppendLine($"\t{0},{0},{0},{0},"); sb.AppendLine($"\t{(int)ExportProtocolType.CAN_MONITOR},{analysisData.BaudRateDbc},(uint32_t){EXINFO_FUN_NAME_CAN2},{frameIdList.Count},"); } else if (protocolType == ProtocolType.ALL) { if (xcpData.AgreeMentType == AgreementType.CCP) { sb.AppendLine($"\t{(int)ExportProtocolType.CCP_OPEN},{xcpData.IF_DATA_ASAP1B_CCP_DATA.BAUDRATE},(uint32_t){EXINFO_FUN_NAME_CAN1},{exInfoLen},"); } else if (xcpData.AgreeMentType == AgreementType.XCP) { if (xcpData.XcpOnCanData.CurrentSelectItem == xcpData.XcpOnCanData.VehicleApplData.CanName) { sb.AppendLine($"\t{(int)ExportProtocolType.XCP_OPEN},{xcpData.XcpOnCanData.VehicleApplData.Baudrate},(uint32_t){EXINFO_FUN_NAME_CAN1},{exInfoLen},"); } else if (xcpData.XcpOnCanData.CurrentSelectItem == xcpData.XcpOnCanData.VehicleApplRamData.CanName) { sb.AppendLine($"\t{(int)ExportProtocolType.XCP_OPEN},{xcpData.XcpOnCanData.VehicleApplRamData.Baudrate},(uint32_t){EXINFO_FUN_NAME_CAN1},{exInfoLen},"); } else if (xcpData.XcpOnCanData.CurrentSelectItem == xcpData.XcpOnCanData.CalibrationLeData.CanName) { sb.AppendLine($"\t{(int)ExportProtocolType.XCP_OPEN},{xcpData.XcpOnCanData.CalibrationLeData.Baudrate},(uint32_t){EXINFO_FUN_NAME_CAN1},{exInfoLen},"); } else if (xcpData.XcpOnCanData.CurrentSelectItem == xcpData.XcpOnCanData.CalibrationLeRamData.CanName) { sb.AppendLine($"\t{(int)ExportProtocolType.XCP_OPEN},{xcpData.XcpOnCanData.CalibrationLeRamData.Baudrate},(uint32_t){EXINFO_FUN_NAME_CAN1},{exInfoLen},"); } } sb.AppendLine($"\t{(int)ExportProtocolType.CAN_MONITOR},{analysisData.BaudRateDbc},(uint32_t){EXINFO_FUN_NAME_CAN2},{frameIdList.Count},"); } sb.AppendLine("};"); WriteData.WriteString(sb, targPath); }
private static void AddA2lDetailGroup(GridViewData listData, string path, XcpData dataCan1) { StringBuilder sbExInfo = new StringBuilder(); sbExInfo.Append(EXINFO_TYPE_HEAD); sbExInfo.AppendLine(EXINFO_FUN_NAME_CAN1 + EXINFO_TYPE_METHOLD_NAME); if (dataCan1.AgreeMentType == AgreementType.CCP) { sbExInfo.AppendLine($"\t\t{(int)ExInfoType.SLAVER_ID_TYPE},{dataCan1.IF_DATA_ASAP1B_CCP_DATA.CAN_MSG_ID_RECE},0,"); sbExInfo.AppendLine($"\t\t{(int)ExInfoType.MASTER_ID_TYPE},{dataCan1.IF_DATA_ASAP1B_CCP_DATA.CAN_MSG_ID_SEND},0,"); sbExInfo.AppendLine($"\t\t{(int)ExInfoType.DAQ100_ID_TYPE},{dataCan1.IF_DATA_ASAP1B_CCP_DATA.CCP_100MS_DATA.CAN_ID_FIXED},0,"); sbExInfo.AppendLine($"\t\t{(int)ExInfoType.DAQ10_ID_TYPE},{dataCan1.IF_DATA_ASAP1B_CCP_DATA.CCP_10MS_DATA.CAN_ID_FIXED},0,"); exInfoLen = 4; if (listData.LimitTimeListSegMent.Count > 0) { sbExInfo.AppendLine("\t\t" + "2" + "," + SEGMENT_NAME + "," + listData.LimitTimeListSegMent.Count + ","); exInfoLen += 1; } if (listData.LimitTimeList100ms.Count > 0) { sbExInfo.AppendLine($"\t\t{(int)ExInfoType.DAQ100_TAB_TYPE},(uint32_t){_100MS_NAME},{listData.LimitTimeList100ms.Count},"); exInfoLen++; } if (listData.LimitTimeList10ms.Count > 0) { sbExInfo.AppendLine($"\t\t{(int)ExInfoType.DAQ10_TAB_TYPE},(uint32_t){_10MS_NAME},{listData.LimitTimeList10ms.Count},"); exInfoLen++; } sbExInfo.AppendLine($"\t\t{(int)ExInfoType.CCP_ECUADDR_TYPE},{dataCan1.IF_DATA_ASAP1B_CCP_DATA.STATION_ADDRESS},0,"); exInfoLen++; sbExInfo.AppendLine("};"); } else if (dataCan1.AgreeMentType == AgreementType.XCP) { exInfoLen = 2; if (dataCan1.XcpOnCanData.CurrentSelectItem == dataCan1.XcpOnCanData.VehicleApplData.CanName) { sbExInfo.AppendLine($"\t\t{(int)ExInfoType.SLAVER_ID_TYPE},{dataCan1.XcpOnCanData.VehicleApplData.SlaveID},0,"); sbExInfo.AppendLine($"\t\t{(int)ExInfoType.MASTER_ID_TYPE},{dataCan1.XcpOnCanData.VehicleApplData.MasterID},0,"); } else if (dataCan1.XcpOnCanData.CurrentSelectItem == dataCan1.XcpOnCanData.VehicleApplRamData.CanName) { sbExInfo.AppendLine($"\t\t{(int)ExInfoType.SLAVER_ID_TYPE},{dataCan1.XcpOnCanData.VehicleApplRamData.SlaveID},0,"); sbExInfo.AppendLine($"\t\t{(int)ExInfoType.MASTER_ID_TYPE},{dataCan1.XcpOnCanData.VehicleApplRamData.MasterID},0,"); } else if (dataCan1.XcpOnCanData.CurrentSelectItem == dataCan1.XcpOnCanData.CalibrationLeData.CanName) { sbExInfo.AppendLine($"\t\t{(int)ExInfoType.SLAVER_ID_TYPE},{dataCan1.XcpOnCanData.CalibrationLeData.SlaveID},0,"); sbExInfo.AppendLine($"\t\t{(int)ExInfoType.MASTER_ID_TYPE},{dataCan1.XcpOnCanData.CalibrationLeData.MasterID},0,"); } else if (dataCan1.XcpOnCanData.CurrentSelectItem == dataCan1.XcpOnCanData.CalibrationLeRamData.CanName) { sbExInfo.AppendLine($"\t\t{(int)ExInfoType.SLAVER_ID_TYPE},{dataCan1.XcpOnCanData.CalibrationLeRamData.SlaveID},0,"); sbExInfo.AppendLine($"\t\t{(int)ExInfoType.MASTER_ID_TYPE},{dataCan1.XcpOnCanData.CalibrationLeRamData.MasterID},0,"); } //sbExInfo.AppendLine($"\t\t{(int)ExInfoType.DAQ100_ID_TYPE},{dataCan1.IF_DATA_ASAP1B_CCP_DATA.CCP_100MS_DATA.CAN_ID_FIXED},0,"); //sbExInfo.AppendLine($"\t\t{(int)ExInfoType.DAQ10_ID_TYPE},{dataCan1.IF_DATA_ASAP1B_CCP_DATA.CCP_10MS_DATA.CAN_ID_FIXED},0,"); if (listData.LimitTimeListSegMent.Count > 0) { sbExInfo.AppendLine("\t\t" + "2" + "," + SEGMENT_NAME + "," + listData.LimitTimeListSegMent.Count + ","); } if (listData.LimitTimeList100ms.Count > 0) { sbExInfo.AppendLine($"\t\t{(int)ExInfoType.DAQ100_TAB_TYPE},(uint32_t){_100MS_NAME},{listData.LimitTimeList100ms.Count},"); exInfoLen++; } if (listData.LimitTimeList10ms.Count > 0) { sbExInfo.AppendLine($"\t\t{(int)ExInfoType.DAQ10_TAB_TYPE},(uint32_t){_10MS_NAME},{listData.LimitTimeList10ms.Count},"); exInfoLen++; } //sbExInfo.AppendLine($"\t\t{(int)ExInfoType.CCP_ECUADDR_TYPE},{dataCan1.IF_DATA_ASAP1B_CCP_DATA.STATION_ADDRESS},0,"); sbExInfo.AppendLine("};"); } WriteData.WriteString(sbExInfo, path); }