Mercurial > silverbladetech
diff MetroWpf/MetroWpf.Framework/Extensions/DirectoryInfoExtensions.cs @ 15:060f02cd4591
Initial commit, pre airport work
author | stevenh7776 stevenhollidge@hotmail.com |
---|---|
date | Mon, 12 Mar 2012 23:05:21 +0800 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MetroWpf/MetroWpf.Framework/Extensions/DirectoryInfoExtensions.cs Mon Mar 12 23:05:21 2012 +0800 @@ -0,0 +1,163 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace MetroWpf +{ + /// <summary> + /// Extension methods for the DirectoryInfo class + /// </summary> + public static class DirectoryInfoExtensions + { + #region · Extensions · + + /// <summary> + /// Gets all files in the directory matching one of the several (!) supplied patterns (instead of just one in the regular implementation). + /// </summary> + /// <param name="directory">The directory.</param> + /// <param name="patterns">The patterns.</param> + /// <returns>The matching files</returns> + /// <remarks>This methods is quite perfect to be used in conjunction with the newly created FileInfo-Array extension methods.</remarks> + /// <example> + /// <code> + /// var files = directory.GetFiles("*.txt", "*.xml"); + /// </code></example> + public static FileInfo[] GetFiles(this DirectoryInfo directory, params string[] patterns) + { + var files = new List<FileInfo>(); + + foreach (var pattern in patterns) + { + files.AddRange(directory.GetFiles(pattern)); + } + + return files.ToArray(); + } + + /// <summary> + /// Searches the provided directory recursively and returns the first file matching the provided pattern. + /// </summary> + /// <param name="directory">The directory.</param> + /// <param name="pattern">The pattern.</param> + /// <returns>The found file</returns> + /// <example> + /// <code> + /// var directory = new DirectoryInfo(@"c:\"); + /// var file = directory.FindFileRecursive("win.ini"); + /// </code></example> + public static FileInfo FindFileRecursive(this DirectoryInfo directory, string pattern) + { + var files = directory.GetFiles(pattern); + + if (files.Length > 0) + { + return files[0]; + } + + foreach (var subDirectory in directory.GetDirectories()) + { + var foundFile = subDirectory.FindFileRecursive(pattern); + + if (foundFile != null) + { + return foundFile; + } + } + + return null; + } + + /// <summary> + /// Searches the provided directory recursively and returns the first file matching to the provided predicate. + /// </summary> + /// <param name="directory">The directory.</param> + /// <param name="predicate">The predicate.</param> + /// <returns>The found file</returns> + /// <example> + /// <code> + /// var directory = new DirectoryInfo(@"c:\"); + /// var file = directory.FindFileRecursive(f => f.Extension == ".ini"); + /// </code></example> + public static FileInfo FindFileRecursive(this DirectoryInfo directory, Func<FileInfo, bool> predicate) + { + foreach (var file in directory.GetFiles()) + { + if (predicate(file)) + { + return file; + } + } + + foreach (var subDirectory in directory.GetDirectories()) + { + var foundFile = subDirectory.FindFileRecursive(predicate); + + if (foundFile != null) + { + return foundFile; + } + } + + return null; + } + + /// <summary> + /// Searches the provided directory recursively and returns the all files matching the provided pattern. + /// </summary> + /// <param name="directory">The directory.</param> + /// <param name="pattern">The pattern.</param> + /// <remarks>This methods is quite perfect to be used in conjunction with the newly created FileInfo-Array extension methods.</remarks> + /// <returns>The found files</returns> + /// <example> + /// <code> + /// var directory = new DirectoryInfo(@"c:\"); + /// var files = directory.FindFilesRecursive("*.ini"); + /// </code></example> + public static FileInfo[] FindFilesRecursive(this DirectoryInfo directory, string pattern) + { + var foundFiles = new List<FileInfo>(); + + FindFilesRecursive(directory, pattern, foundFiles); + + return foundFiles.ToArray(); + } + + private static void FindFilesRecursive(DirectoryInfo directory, string pattern, List<FileInfo> foundFiles) + { + foundFiles.AddRange(directory.GetFiles(pattern)); + + directory.GetDirectories().ForEach(d => FindFilesRecursive(d, pattern, foundFiles)); + } + + /// <summary> + /// Searches the provided directory recursively and returns the all files matching to the provided predicate. + /// </summary> + /// <param name="directory">The directory.</param> + /// <param name="predicate">The predicate.</param> + /// <returns>The found files</returns> + /// <remarks>This methods is quite perfect to be used in conjunction with the newly created FileInfo-Array extension methods.</remarks> + /// <example> + /// <code> + /// var directory = new DirectoryInfo(@"c:\"); + /// var files = directory.FindFilesRecursive(f => f.Extension == ".ini"); + /// </code></example> + public static FileInfo[] FindFilesRecursive(this DirectoryInfo directory, Func<FileInfo, bool> predicate) + { + var foundFiles = new List<FileInfo>(); + + FindFilesRecursive(directory, predicate, foundFiles); + + return foundFiles.ToArray(); + } + + private static void FindFilesRecursive(DirectoryInfo directory, Func<FileInfo, bool> predicate, List<FileInfo> foundFiles) + { + foundFiles.AddRange(directory.GetFiles().Where(predicate)); + + directory.GetDirectories().ForEach(d => FindFilesRecursive(d, predicate, foundFiles)); + } + + #endregion + } +} \ No newline at end of file