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