using System; using System.Collections.Generic; using System.IO; using System.Text.RegularExpressions; #if NET462_OR_GREATER || NETCOREAPP using SharpCompress.Archives; using SharpCompress.Archives.Zip; #endif namespace MPF.Processors.OutputFiles { /// /// Represents a single output file with a Regex-matched name /// internal class RegexOutputFile : OutputFile { /// /// Create an OutputFile with a single filename /// public RegexOutputFile(string filename, OutputFileFlags flags) : base([filename], flags) { } /// /// Create an OutputFile with a single filename /// public RegexOutputFile(string filename, OutputFileFlags flags, string artifactKey) : base([filename], flags, artifactKey) { } /// /// Create an OutputFile with set of filenames /// public RegexOutputFile(string[] filenames, OutputFileFlags flags) : base(filenames, flags) { } /// /// Create an OutputFile with set of filenames /// public RegexOutputFile(string[] filenames, OutputFileFlags flags, string artifactKey) : base(filenames, flags, artifactKey) { } /// public override bool Exists(string outputDirectory) { // Ensure the directory exists if (!Directory.Exists(outputDirectory)) return false; // Get list of all files in directory var directoryFiles = Directory.GetFiles(outputDirectory); foreach (string file in directoryFiles) { if (Array.FindIndex(Filenames, pattern => Regex.IsMatch(file, pattern)) > -1) return true; } return false; } #if NET462_OR_GREATER || NETCOREAPP /// public override bool Exists(ZipArchive? archive) { // If the archive is invalid if (archive is null) return false; // Get list of all files in archive foreach (var entry in archive.Entries) { if (entry.Key is null) continue; if (Array.Exists(Filenames, pattern => Regex.IsMatch(entry.Key, pattern))) return true; } return false; } /// public override bool Extract(ZipArchive? archive, string outputDirectory) { // If the archive is invalid if (archive is null) return false; // Get list of all files in archive foreach (var entry in archive.Entries) { if (entry.Key is null) continue; var matches = Array.FindAll(Filenames, pattern => Regex.IsMatch(entry.Key, pattern)); if (matches.Length > 0) { try { string outputPath = Path.Combine(outputDirectory, entry.Key); entry.WriteToFile(outputPath); } catch { } } } return true; } #endif /// public override List GetPaths(string outputDirectory) { // Ensure the directory exists if (!Directory.Exists(outputDirectory)) return []; List paths = []; // Get list of all files in directory var directoryFiles = Directory.GetFiles(outputDirectory); foreach (string file in directoryFiles) { var matches = Array.FindAll(Filenames, pattern => Regex.IsMatch(file, pattern)); if (matches is not null && matches.Length > 0) paths.Add(file); } return paths; } } }