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