/// <summary> /// 把单行线都统一为增里程(包括正方向和反方向) /// </summary> /// <param name="citFileName">cit文件路径</param> public void ModifyCitMergeKmInc(String citFileName) { FileInformation citHeaderInfo = GetFileInformation(citFileName); bool isKmInc = IsCitKmInc(citFileName); //文件头中指示为增里程,且文件中确实为增里程,则不需要处理,直接返回。 if (citHeaderInfo.iKmInc == 0 && isKmInc == true) { return; } //以下情况:有可能是文件头指示错误或是实际文件确实为减里程 //统一为增里程 if (citHeaderInfo.iKmInc != 0) { citHeaderInfo.iKmInc = 0; } try { #region 存取文件 FileStream fsRead = new FileStream(citFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); FileStream fsWrite = new FileStream(citFileName + ".bak", FileMode.Create, FileAccess.Write, FileShare.ReadWrite); BinaryReader br = new BinaryReader(fsRead, Encoding.UTF8); BinaryWriter bw1 = new BinaryWriter(fsWrite, Encoding.UTF8); byte[] bHead = br.ReadBytes(120); byte[] bChannels = br.ReadBytes(65 * citHeaderInfo.iChannelNumber); byte[] bData = new byte[citHeaderInfo.iChannelNumber * 2]; byte[] bDataNew = new byte[citHeaderInfo.iChannelNumber * 2]; byte[] bTail = br.ReadBytes(BitConverter.ToInt32(br.ReadBytes(4), 0)); //bw1.Write(bHead); bw1.Write(GetBytesFromDataHeadInfo(citHeaderInfo));//文件头 FileInformation citHeader = GetDataInfoHead(GetBytesFromDataHeadInfo(citHeaderInfo)); bw1.Write(bChannels); bw1.Write(bTail.Length); bw1.Write(bTail); long startPos = br.BaseStream.Position;//记录数据开始位置的文件指针 //增里程时,不反转 if (isKmInc == true) { while (br.BaseStream.Position < br.BaseStream.Length) { bw1.Write(br.ReadBytes(citHeaderInfo.iChannelNumber * 2)); //br.BaseStream.Position += m_dhi.iChannelNumber * 2; } } else { br.BaseStream.Position = br.BaseStream.Length - citHeaderInfo.iChannelNumber * 2; while (br.BaseStream.Position >= startPos) { bw1.Write(br.ReadBytes(citHeaderInfo.iChannelNumber * 2)); br.BaseStream.Position -= citHeaderInfo.iChannelNumber * 2 * 2; //liyang: 这块怎么乘以4了 ? } } // bw1.Close(); br.Close(); fsWrite.Close(); fsRead.Close(); //删除bak File.Delete(citFileName); File.Move(citFileName + ".bak", citFileName); #endregion } catch (System.Exception ex) { throw ex; } return; }
/// <summary> /// 向cit文件中写入文件头、数据块 /// </summary> /// <param name="citFile">cit文件路径</param> /// <param name="fi">文件信息</param> /// <param name="channelList">通道定义集合</param> /// <param name="extraInfo">补充信息</param> /// <param name="arrayDone">通道数据数组集合</param> /// <returns>true:成功;false:失败</returns> private bool WriteCitFileTemp(string citFile, FileInformation fi, List <ChannelDefinition> channelList, string extraInfo, List <double[]> arrayDone) { try { using (FileStream fsWrite = new FileStream(citFile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite)) { using (BinaryWriter bw = new BinaryWriter(fsWrite, Encoding.UTF8)) { //写文件头文件信息 bw.Write(GetBytesFromDataHeadInfo(fi)); //写文件头通道定义 bw.Write(GetBytesFromChannelDataInfoList(channelList)); //写文件头补充信息 byte[] tmpBytes = UnicodeEncoding.Default.GetBytes(extraInfo); //bw.Write((Byte)(tmpBytes.Length)); bw.Write(tmpBytes); if (tmpBytes.Length < 4) { for (int i = 0; i < (4 - tmpBytes.Length); i++) { bw.Write((byte)0); } } int iChannelNumberSize = fi.iChannelNumber * 2; byte[] dataArray = new byte[iChannelNumberSize]; List <Byte> dataList = new List <Byte>(); short tmpRmsData = 0; Byte[] tmpDataBytes = new Byte[2]; long iArrayLen = arrayDone[0].Length; for (int k = 0; k < iArrayLen; k++) { if (Encryption.IsEncryption(fi.sDataVersion)) { for (int iTmp = 0; iTmp < channelList.Count; iTmp++) { tmpRmsData = (short)((arrayDone[iTmp][k] - channelList[iTmp].fOffset) * channelList[iTmp].fScale); tmpDataBytes = Encryption.Translate(BitConverter.GetBytes(tmpRmsData)); dataList.AddRange(tmpDataBytes); } } else { for (int iTmp = 0; iTmp < channelList.Count; iTmp++) { tmpRmsData = (short)((arrayDone[iTmp][k] - channelList[iTmp].fOffset) * channelList[iTmp].fScale); dataList.AddRange(BitConverter.GetBytes(tmpRmsData)); } } dataList.Clear(); } bw.Close(); } fsWrite.Close(); } return(true); } catch (Exception ex) { throw new Exception(ex.Message); } }
/// <summary> /// 把反方向检测转换为正方向检测 /// </summary> /// <param name="citFileName">cit文件路径</param> public void ModifyCitReverseToForward(String citFileName) { FileInformation citHeaderInfo = GetFileInformation(citFileName); List <ChannelDefinition> channelList = GetChannelDefinitionList(citFileName); //左高低与右高低对调 ChannelExchange(channelList, "L_Prof_SC", "R_Prof_SC", false); ChannelExchange(channelList, "L_Prof_SC_70", "R_Prof_SC_70", false); ChannelExchange(channelList, "L_Prof_SC_120", "R_Prof_SC_120", false); ChannelDefinition m_dci_a = new ChannelDefinition(); //左轨向与右轨向对调,然后幅值*(-1) ChannelExchange(channelList, "L_Align_SC", "R_Align_SC", true); ChannelExchange(channelList, "L_Align_SC_70", "R_Align_SC_70", true); ChannelExchange(channelList, "L_Align_SC_120", "R_Align_SC_120", true); //水平、超高、三角坑、曲率、曲率变化率*(-1) for (int i = 0; i < channelList.Count; i++) { if (channelList[i].sNameEn.Equals("Crosslevel")) { m_dci_a = channelList[i]; m_dci_a.fScale = m_dci_a.fScale * (-1); channelList[i] = m_dci_a; } if (channelList[i].sNameEn.Equals("Superelevation")) { m_dci_a = channelList[i]; m_dci_a.fScale = m_dci_a.fScale * (-1); channelList[i] = m_dci_a; } if (channelList[i].sNameEn.Equals("Short_Twist")) { m_dci_a = channelList[i]; m_dci_a.fScale = m_dci_a.fScale * (-1); channelList[i] = m_dci_a; } if (channelList[i].sNameEn.Equals("Curvature")) { m_dci_a = channelList[i]; m_dci_a.fScale = m_dci_a.fScale * (-1); channelList[i] = m_dci_a; } if (channelList[i].sNameEn.Equals("Curvature_Rate")) { m_dci_a = channelList[i]; m_dci_a.fScale = m_dci_a.fScale * (-1); channelList[i] = m_dci_a; } } try { #region 存取文件 FileStream fsRead = new FileStream(citFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); FileStream fsWrite = new FileStream(citFileName + ".bak", FileMode.Create, FileAccess.Write, FileShare.ReadWrite); BinaryReader br = new BinaryReader(fsRead, Encoding.UTF8); BinaryWriter bw1 = new BinaryWriter(fsWrite, Encoding.UTF8); byte[] bHead = br.ReadBytes(120); byte[] bChannels = br.ReadBytes(65 * citHeaderInfo.iChannelNumber); byte[] bData = new byte[citHeaderInfo.iChannelNumber * 2]; byte[] bDataNew = new byte[citHeaderInfo.iChannelNumber * 2]; byte[] bTail = br.ReadBytes(BitConverter.ToInt32(br.ReadBytes(4), 0)); //bw1.Write(bHead); bw1.Write(GetBytesFromDataHeadInfo(citHeaderInfo));//文件头 //反向--转换为正向 if (citHeaderInfo.iRunDir == 0) { bw1.Write(bChannels); } else { bw1.Write(GetBytesFromChannelDataInfoList(channelList)); } bw1.Write(bTail.Length); bw1.Write(bTail); long startPos = br.BaseStream.Position;//记录数据开始位置的文件指针 while (br.BaseStream.Position < br.BaseStream.Length) { bw1.Write(br.ReadBytes(citHeaderInfo.iChannelNumber * 2)); } bw1.Close(); br.Close(); fsWrite.Close(); fsRead.Close(); //删除bak File.Delete(citFileName); File.Move(citFileName + ".bak", citFileName); #endregion } catch (System.Exception ex) { throw ex; } }