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());
}
}
}