using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DW5S.DTO { /// /// 信号文件 /// public class SignalFile { public const string SigTimeFolderFormat = "yyyyMMdd_HH"; public const string SigTimeFileFormat = "yyyyMMddHHmmss"; public const string SigFreqFormat = "#######0.000###"; public const string BandWidthFormat = "######0.###"; /// /// 信号文件实体类 /// public SignalFile() { } /// /// 信号时间 /// public DateTime SigTime { get; set; } /// /// 信号频点 /// public long SigFreq { get; set; } /// /// 信号带宽 /// public int BandWidth { get; set; } /// /// 采样率 /// public int Fs { get; set; } /// /// 接收站编码 /// public string SiteCode { get; set; } /// /// 采集卡编码 /// public string AdCardID { get; set; } /// /// 采集通道编号 /// public int ChNum { get; set; } /// /// 卫星编号 /// public string SatInfoID { get; set; } /// /// 日志目录(E:\data) /// public string DirName { get; set; } /// /// 日期目录名称(20241129_13) /// public string DateDirName => SigTime.ToString(SigTimeFolderFormat); /// /// 文件名称(xxx.dat) /// public string FileName => GetFileName(SigTime, SigFreq, BandWidth, Fs, SiteCode, AdCardID, ChNum, SatInfoID); /// /// http下载文件名称(http://127.0.0.1/data/xxx.dat) /// public string HttpFile { get; set; } /// /// 获取文件全路径 /// public string GetLocalFullName() { return FileName; } /// /// 获取文件全路径 /// public string GetLocalFullPath() { string fullName = Path.Combine(DirName, DateDirName, FileName); return fullName; } /// /// 将文件名转换为信号文件对象 /// /// /// public static SignalFile Parse(string input) { if (string.IsNullOrWhiteSpace(input)) return null; input = Path.GetFileNameWithoutExtension(input); var items = input.Split('_'); var result = new SignalFile(); DateTime sigTime; if (DateTime.TryParseExact(items[0], SigTimeFileFormat, CultureInfo.CurrentUICulture, DateTimeStyles.None, out sigTime)) { result.SigTime = sigTime; } foreach (var item in items) { var key = item[0]; var val = item.Substring(1); switch (key) { case 'F': result.SigFreq = double.TryParse(val, out double sigFreq) ? (long)Math.Round(sigFreq * 1e6, 0) : 0L; break; case 'W': result.BandWidth = double.TryParse(val, out double bandWidth) ? (int)Math.Round(bandWidth * 1e3) : 0; break; case 'C': result.Fs = int.TryParse(val, out int fs) ? fs : 0; break; case 'R': result.SiteCode = val; break; case 'K': result.AdCardID = val; break; case 'T': result.ChNum = int.TryParse(val, out int chNum) ? chNum : 0; break; case 'S': result.SatInfoID = val; break; } } return result; } /// /// 获取文件名称 /// /// 信号时间 /// 信号频点 /// 信号带宽 /// 采样率 /// 卫星编号 /// 站点编码 /// 采集卡编码 /// 通道号 /// 值为空时的替换符 /// public static string GetFileName(DateTime? sigTime, long? sigFreq, int? bandWidth, int? fs, string siteCode, string adcCode, int? chNum, string satNum, string nullText = "") { string sigTimeText = sigTime.HasValue ? sigTime.Value.ToString(SigTimeFileFormat) : nullText; string sigFreqText = sigFreq.HasValue && sigFreq > 0 ? "_F" + Math.Round(sigFreq.Value * 1e-6, 6).ToString(SigFreqFormat) : nullText; string bandWidthText = bandWidth.HasValue && bandWidth > 0 ? "_W" + Math.Round(bandWidth.Value * 1e-3, 3).ToString(BandWidthFormat) : nullText; string fsText = fs.HasValue && fs > 0 ? "_C" + fs.Value.ToString() : nullText; string siteCodeText = !string.IsNullOrWhiteSpace(siteCode) ? "_" + siteCode.Trim() : nullText; string adcCodeText = !string.IsNullOrWhiteSpace(adcCode) ? "_" + adcCode.Trim() : nullText; string chNumText = chNum.HasValue && chNum > 0 ? $"_T{chNum}" : nullText; string satNumText = !string.IsNullOrWhiteSpace(satNum) ? "_S" + satNum.Trim() : nullText; return string.Concat(sigTimeText, sigFreqText, bandWidthText, fsText, siteCodeText, adcCodeText, chNumText, satNumText, ".dat"); } /// /// 创建信号文件基础信息 /// /// 信号时间 /// 信号频点 /// 信号带宽 /// 采样率(个) /// 卫星编号 /// 站点编码 /// 采集卡编码 /// 通道号 /// public static SignalFile Create(DateTime sigTime, long sigFreq, int bandWidth, int fs, string siteCode, string adcCode, int chNum, string satNum) { var result = new SignalFile() { SigTime = sigTime, SigFreq = sigFreq, BandWidth = bandWidth, Fs = fs, SiteCode = siteCode, AdCardID = adcCode, ChNum = chNum, SatInfoID = satNum }; return result; } } }