using CommonLib.DAQ; using CommonLib.LOG; using DataCollectionSystem; using System; using System.Collections.Generic; using System.IO; using System.Text; namespace CommonLib.IO.File { /// /// 采样数据存储与读取类 /// public class FIFO_IO_FILE { public EventHandler EventCloseFile; public string SaveFileName { get; private set; } public DateTime StartTime { get; private set; } private PacketCaptureWriter fifo_write; private PacketCaptureReader fifo_read; private FileStream fs; int carNO; int channel; /// /// 初始化下载文件名,下标从0 开始 /// /// /// public void Init_Write_Stream(int vcardNo,int vchannel) { this.carNO = vcardNo + 1; this.channel = vchannel + 1; string strCardNO = carNO.ToString(); string strChannel = channel.ToString(); string FileFullName = string.Empty; this.StartTime = DateTime.Now; FileFullName = Environment.CurrentDirectory + string.Format("\\FIFO_Data\\card{0}\\line{1}\\FIFO{2}.cap", strCardNO, channel, DateTime.Now.ToString("yyyy-MM-dd-HHmmss")); string dir = Path.GetDirectoryName(FileFullName); if(!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } fs = new FileStream(FileFullName, FileMode.OpenOrCreate); SaveFileName = FileFullName; fifo_write = new PacketCaptureWriter(fs, LinkLayerType.User0 ); LogStorage.Logs.Add(LogLevel.Trace, string.Format("{0}#板卡通道{1}初始化写入数据流!", carNO, channel)); } /// /// 写入数据 /// /// public void Write_FIFO_Data(byte[] fifoData) { try { PacketCapture packetFifo = new PacketCapture(fifoData); fifo_write.Write(packetFifo); fifo_write.Flush(); // LogStorage.Logs.Add(LogLevel.Trace, string.Format("{0}#板卡通道{1}写入数据流完成.", carNO, channel)); } catch (Exception ex) { LogStorage.Logs.Add(LogLevel.Error, string.Format("{0}#板卡通道{1}写入数据流失败!",carNO,channel));//$"{carNO}#板卡通道{channel}写入数据流失败!"); LogStorage.Logs.Add(LogLevel.Error, ex.Message + "\n" + ex.StackTrace); } } /// /// 初始化 /// /// /// public bool Init_Read_Stream(string fileName) { bool bRead = false; try { fs = new FileStream(fileName, FileMode.Open); fifo_read = new PacketCaptureReader(fs); bRead = true; LogStorage.Logs.Add(LogLevel.Trace, string.Format("读取数据流初始化完成,读取文件为{0}.", fileName)); } catch (Exception ex) { LogStorage.Logs.Add(LogLevel.Error, string.Format("读取数据流初始化失败!", fileName));//$"{fileName}写入数据流初始化失败!"); LogStorage.Logs.Add(LogLevel.Error, ex.Message + "\n" + ex.StackTrace); } return bRead; } /// /// 读取文件 /// /// public byte[] Read_FIFO_Data() { byte[] data = null; try { byte[] FileByte = new byte[12]; PacketCapture packetFifo = new PacketCapture(FileByte); //这个玩意顶个蛋用,逗我呢? packetFifo = fifo_read.Read(); if (packetFifo != null) { data = packetFifo.Packet.Array; } //LogStorage.Logs.Add(LogLevel.Trace, string.Format("读取数据流完成.")); } catch (Exception ex) { LogStorage.Logs.Add(LogLevel.Error, string.Format("读取数据流 读取失败!", fs.Name)); LogStorage.Logs.Add(LogLevel.Error, ex.Message + "\n" + ex.StackTrace); } return data; } public void CloseFile() { try { if (fs != null) { DoEventCloseFile(); fs.Close(); if(fs.CanRead) LogStorage.Logs.Add(LogLevel.Trace, string.Format("{0}#板卡通道{1}数据流文件关闭.", carNO , channel)); else LogStorage.Logs.Add(LogLevel.Trace, string.Format("写文件数据流文件关闭.")); } } catch(Exception ex) { LogStorage.Logs.Add(LogLevel.Error,string.Format("{0}关闭失败!",fs.Name) ); LogStorage.Logs.Add(LogLevel.Error, ex.Message + "\n" + ex.StackTrace); } } private void DoEventCloseFile() { string FilePath = Path.GetDirectoryName(SaveFileName); string FileExt = Path.GetExtension(SaveFileName); int removeFileBeforeDays = MainForm.configValue.removeFileBeforeDays; //删除旧文件 List allFiles = CommonLib.IO.CommonFile.GetAllFilesInDirectory(FilePath, $"*{FileExt}"); foreach(FileInfo fileInfo in allFiles) { var timespan = DateTime.Now - fileInfo.CreationTime ; if (timespan.Days> removeFileBeforeDays) { System.IO.File.Delete(fileInfo.FullName); } } // EventCloseFile?.Invoke(this, new EventArgs()); } } }