using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using NaturalSort;
namespace SabreTools.IO
{
///
/// Methods around path operations
///
public static class PathTool
{
///
/// Retrieve a list of just directories from inputs
///
/// List of strings representing directories and files
/// True if the parent name should be included in the ParentablePath, false otherwise (default)
/// List of strings representing just directories from the inputs
public static List GetDirectoriesOnly(List inputs, bool appendparent = false)
{
List outputs = new List();
for (int i = 0; i < inputs.Count; i++)
{
string input = inputs[i];
// If we have a null or empty path
if (string.IsNullOrEmpty(input))
continue;
// If we have a wildcard
string pattern = "*";
if (input.Contains("*") || input.Contains("?"))
{
pattern = Path.GetFileName(input);
input = input.Substring(0, input.Length - pattern.Length);
}
// Get the parent path in case of appending
string parentPath = Path.GetFullPath(input);
if (Directory.Exists(input))
{
List directories = GetDirectoriesOrdered(input, pattern);
foreach (string dir in directories)
{
outputs.Add(new ParentablePath(Path.GetFullPath(dir), appendparent ? parentPath : string.Empty));
}
}
}
return outputs;
}
///
/// Retrieve a list of directories from a directory recursively in proper order
///
/// Directory to parse
/// Optional pattern to search for directory names
/// List with all new files
private static List GetDirectoriesOrdered(string dir, string pattern = "*")
{
return GetDirectoriesOrderedHelper(dir, new List(), pattern);
}
///
/// Retrieve a list of directories from a directory recursively in proper order
///
/// Directory to parse
/// List representing existing files
/// Optional pattern to search for directory names
/// List with all new files
private static List GetDirectoriesOrderedHelper(string dir, List infiles, string pattern)
{
// Take care of the files in the top directory
List toadd = Directory.EnumerateDirectories(dir, pattern, SearchOption.TopDirectoryOnly).ToList();
toadd.Sort(new NaturalComparer());
infiles.AddRange(toadd);
// Then recurse through and add from the directories
foreach (string subDir in toadd)
{
infiles = GetDirectoriesOrderedHelper(subDir, infiles, pattern);
}
// Return the new list
return infiles;
}
///
/// Retrieve a list of just files from inputs
///
/// List of strings representing directories and files
/// True if the parent name should be be included in the ParentablePath, false otherwise (default)
/// List of strings representing just files from the inputs
public static List GetFilesOnly(List inputs, bool appendparent = false)
{
List outputs = new List();
for (int i = 0; i < inputs.Count; i++)
{
string input = inputs[i].Trim('"');
// If we have a null or empty path
if (string.IsNullOrEmpty(input))
continue;
// If we have a wildcard
string pattern = "*";
if (input.Contains("*") || input.Contains("?"))
{
pattern = Path.GetFileName(input);
input = input.Substring(0, input.Length - pattern.Length);
}
// Get the parent path in case of appending
string parentPath = Path.GetFullPath(input);
if (Directory.Exists(input))
{
List files = GetFilesOrdered(input, pattern);
foreach (string file in files)
{
outputs.Add(new ParentablePath(Path.GetFullPath(file), appendparent ? parentPath : string.Empty));
}
}
else if (File.Exists(input))
{
outputs.Add(new ParentablePath(Path.GetFullPath(input), appendparent ? parentPath : string.Empty));
}
}
return outputs;
}
///
/// Retrieve a list of files from a directory recursively in proper order
///
/// Directory to parse
/// Optional pattern to search for directory names
/// List with all new files
public static List GetFilesOrdered(string dir, string pattern = "*")
{
return GetFilesOrderedHelper(dir, new List(), pattern);
}
///
/// Retrieve a list of files from a directory recursively in proper order
///
/// Directory to parse
/// List representing existing files
/// Optional pattern to search for directory names
/// List with all new files
private static List GetFilesOrderedHelper(string dir, List infiles, string pattern)
{
// Take care of the files in the top directory
List toadd = Directory.EnumerateFiles(dir, pattern, SearchOption.TopDirectoryOnly).ToList();
toadd.Sort(new NaturalComparer());
infiles.AddRange(toadd);
// Then recurse through and add from the directories
List subDirs = Directory.EnumerateDirectories(dir, pattern, SearchOption.TopDirectoryOnly).ToList();
subDirs.Sort(new NaturalComparer());
foreach (string subdir in subDirs)
{
infiles = GetFilesOrderedHelper(subdir, infiles, pattern);
}
// Return the new list
return infiles;
}
///
/// Get the current runtime directory
///
public static string GetRuntimeDirectory()
{
string exeName = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase).LocalPath;
return Path.GetDirectoryName(exeName);
}
}
}