Mercurial > silverbladetech
view MetroWpf/MetroWpf.Framework/Extensions/DirectoryInfoExtensions.cs @ 60:fc62c971a117
upload to blog
author | Steven Hollidge <stevenhollidge@hotmail.com> |
---|---|
date | Sat, 21 Apr 2012 21:19:39 +0100 |
parents | 060f02cd4591 |
children |
line wrap: on
line source
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 } }