Files

326 lines
13 KiB
C#
Raw Permalink Normal View History

2026-04-17 14:55:32 -04:00
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Windows;
using DataPROWin7.Common;
using DTS.Common.Base;
using DTS.Serialization;
using DTS.Common.Utilities.Logging;
using File = System.IO.File;
using System.Xml.Linq;
using DTS.Common.SharedResource.Strings;
using DTS.Common.DataModel;
using DTS.Common.Utils;
using DTS.Common.DataModel.Classes.TestTemplate;
namespace DataPROWin7.DataModel
{
public class DataFiles : BasePropertyChanged
{
public DataFiles(string expandCollapse,
string testName,
string id,
string allOrROI,
string lab,
string customer,
DateTime dateCreated,
string description,
string numberOfChannels,
string testEngineer,
bool isTSRAIR,
string roiSuffix = "")
{
ExpandCollapse = expandCollapse;
TestName = testName;
TestId = id;
AllOrROI = allOrROI;
Lab = lab;
Customer = customer;
DateCreated = dateCreated;
Description = description;
NumberOfChannels = numberOfChannels;
TestEngineer = testEngineer;
ROISuffix = roiSuffix;
IsTSRAIR = isTSRAIR;
}
public string LongString { get; set; }
public bool TestSelected { get; set; }
public string ExpandCollapse { get; set; }
public string TestId { get; set; }
public string TestName { get; set; }
public string AllOrROI { get; set; }
public string Lab { get; set; }
public string Customer { get; set; }
public DateTime DateCreated { get; set; }
public string Description { get; set; }
public string NumberOfChannels { get; set; }
public string TestEngineer { get; set; }
public string ROISuffix { get; set; }
/// <summary>
/// location of DTS file if known (populated in export tab)
/// 18525 The data set is in Data folder but not listed on Export Data tab
/// </summary>
public string DTSFile { get; set; }
public bool IsTSRAIR { get; set; } = false;
}
public class DataFilesList : BasePropertyChanged
{
/// <summary>
/// returns all folders that have a dts and .chn files, recursively travels down subfolders
/// </summary>
private string[] GetFoldersWithData(string folder)
{
var folders = new List<string>();
var subFolders = Directory.GetDirectories(folder);
foreach (var subFolder in subFolders) { folders.AddRange(GetFoldersWithData(subFolder)); }
var files = Directory.GetFiles(folder);
if (Array.Exists(files, f => f.ToLower().Contains(".dts")) && Array.Exists(files, f => f.ToLower().Contains(".chn")))
{
folders.Add(folder);
}
return folders.ToArray();
}
public string DownloadFolder = string.Empty;
/// <summary>
/// parses out the test information out of a DTS file without loading the entire file into memory with DOM xml
/// we could use a SAX parser instead
/// 23342 Export and View Tiles very slow [APG-ATEC]
/// </summary>
/// <param name="dtsFilePath"></param>
/// <param name="lab"></param>
/// <param name="customer"></param>
/// <param name="description"></param>
/// <param name="testEngineer"></param>
/// <param name="dt"></param>
/// <param name="name"></param>
/// <returns></returns>
private bool GetTestInfo(string dtsFilePath, out string lab, out string customer, out string description,
out string testEngineer, out DateTime dt, out string name)
{
//initialize all returns, then fill them in if the info is in the file
lab = string.Empty;
customer = string.Empty;
description = string.Empty;
testEngineer = string.Empty;
dt = DateTime.MinValue;
name = string.Empty;
try
{
var sFile = DTS.Serialization.SliceRaw.File.Reader.ReadTestStringsFromFile(dtsFilePath);
var testInfoLine = Array.Find(sFile, f => f.Contains("<Test Id"));
if (null == testInfoLine) { return false; }
//the <Test> tag is incomplete, so add an end tag just so xml doesn't complain
testInfoLine = $"{testInfoLine}</Test>";
var testXml = XElement.Parse(testInfoLine);
description = testXml.Attribute("Description").Value;
name = testXml.Attribute("Id").Value;
var teLine = Array.Find(sFile, f => f.Contains("<TEName>"));
if (null != teLine)
{
var teXml = XElement.Parse(teLine);
testEngineer = teXml.Value;
}
var labLine = Array.Find(sFile, f => f.Contains("<LabName>"));
if (null != labLine)
{
var labXml = XElement.Parse(labLine);
lab = labXml.Value;
}
var custLine = Array.Find(sFile, f => f.Contains("<CustName>"));
if (null != custLine)
{
var custXml = XElement.Parse(custLine);
customer = custXml.Value;
}
var timeStampLine = Array.Find(sFile, f => f.Contains("<Timestamp>"));
if (null != timeStampLine)
{
var timeStampXml = XElement.Parse(timeStampLine);
dt = DateTime.Parse(timeStampXml.Value, CultureInfo.InvariantCulture);
}
return true;
}
catch (Exception ex)
{
APILogger.Log(ex);
return false;
}
}
public DataFiles[] GetAllFiles(string testName)
{
//FB 32926 No need to check for instance since always would have a value
//var current = (App) Application.Current;
//if (current == null) { return new DataFiles[0]; }
var dataFiles = new List<DataFiles>();
try
{
var testNameFolder = Path.GetFullPath(DataModelSettings.DownloadFolder);
DownloadFolder = testNameFolder;
testNameFolder = Path.Combine(testNameFolder, testName);
if (Directory.Exists(testNameFolder))
{
var foldersWithData = GetFoldersWithData(testNameFolder);
foreach (string folder in foldersWithData)
{
var dtsFiles = Directory.GetFiles(folder, "*.dts");
if (1 != dtsFiles.Length) { continue; }
var dtsFile = dtsFiles[0];
if (!GetTestInfo(dtsFiles[0], out var lab, out var customer, out var description,
out var testEngineer, out var dt, out var name)) { continue; }
var isTSRAIR = dtsFiles[0].Contains(TSRAIRGoTestSetup.TEST_NAME);
var numberOfChannels = string.Empty;
var directoryInfo = new FileInfo(dtsFile).Directory;
if (directoryInfo != null)
{
var channels = Directory.GetFiles(directoryInfo.FullName, "*.chn");
numberOfChannels = channels.Length.ToString();
}
var subFolders = folder.Split(Path.DirectorySeparatorChar).ToList();
var binaryFolderIndex = subFolders.IndexOf("Binary");
var allOrROI = StringResources.Table_NA;
//as long as we found the binary folder, use the next folder to determine All or ROI
if (binaryFolderIndex > 0)
{
allOrROI = subFolders[binaryFolderIndex + 1];
}
var roiSuffix = TestUtils.ParseROISuffix(folder);
var dtsFileInfo = new FileInfo(dtsFile);
var testId = dtsFileInfo.Name.Replace(dtsFileInfo.Extension, "");
var df = new DataFiles(string.Empty, name,
testId, allOrROI, lab, customer, dt, description, numberOfChannels, testEngineer, isTSRAIR,
roiSuffix)
{ DTSFile = dtsFile };
dataFiles.Add(df);
}
}
}
catch (Exception ex)
{
APILogger.Log("Failed to retrieve Data Files", ex);
}
return dataFiles.ToArray();
}
public DataFiles[] Contract(DataFiles df)
{
_dataFiles.RemoveAll(item => (item.TestName == df.TestName) && (item.ExpandCollapse != "-"));
_dataFiles.Find(item => item.TestName == df.TestName).ExpandCollapse = "+";
return _dataFiles.ToArray();
}
public DataFiles[] GetAllDataFiles()
{
var dataFiles = new List<DataFiles>();
try
{
var dataFolder = Path.GetFullPath(DataModelSettings.DownloadFolder);
if (Directory.Exists(dataFolder))
{
var testFolders = Directory.GetDirectories(dataFolder);
foreach (var testFolder in testFolders)
{
var testName = new DirectoryInfo(testFolder).Name;
var testIdFolders = Directory.GetDirectories(testFolder);
var fileCount = 0;
foreach (var testIdFolder in testIdFolders)
{
if (!Directory.Exists(Path.Combine(testIdFolder, "Binary"))) continue;
var binaryFolder = Path.Combine(testIdFolder, "Binary");
var testId = new DirectoryInfo(testIdFolder).Name;
fileCount += GetFileCount(binaryFolder, testId);
}
if (fileCount <= 0) continue;
var isTSRAIR = testFolder.Contains(TSRAIRGoTestSetup.TEST_NAME);
var df = new DataFiles("+", testName, string.Empty, string.Empty, string.Empty, string.Empty, new DateTime(), string.Empty, string.Empty, string.Empty, isTSRAIR);
dataFiles.Add(df);
}
}
}
catch (Exception ex)
{
APILogger.Log("Failed to retrieve Data Files", ex);
}
return dataFiles.ToArray();
}
/// <summary>
/// gets the count of tests data sets in the given binary folder
/// this means it will traverse down the given folder looking for dts and chn files
/// matching a pattern
/// </summary>
private int GetFileCount(string binaryFolder, string testId)
{
var count = 0;
var subFolders = Directory.GetDirectories(binaryFolder);
foreach (var subfolder in subFolders)
{
count += GetFileCount(subfolder, testId);
}
//different tests seem to name the dts file differently
//lets not care about the name as long as there's only one dts file
//and there's chn files which follow the dts file name
var dtsFiles = Directory.GetFiles(binaryFolder, "*.dts");
if (1 == dtsFiles.Length)
{
var fi = new FileInfo(dtsFiles[0]);
var testName = fi.Name.Replace(fi.Extension, "");
//make sure there's at least one file
if (Directory.GetFiles(binaryFolder, $"{testName}*.*.chn").Any())
{
count++;
}
}
return count;
}
private List<DataFiles> _dataFiles;
public DataFiles[] DataFiles
{
get
{
_dataFiles = new List<DataFiles>();
_dataFiles.AddRange(GetAllDataFiles());
return _dataFiles.ToArray();
}
set => SetProperty(ref _dataFiles, new List<DataFiles>(value), "DataFiles");
}
private static DataFilesList _dataFileList;
public static DataFilesList DataFileList => _dataFileList ?? (_dataFileList = new DataFilesList());
}
}