/// <summary>
 /// Returns an enumerable collection of files (including full paths) that match a pattern in a specified path,
 /// and optionally searches subdirectories.
 /// </summary>
 /// <param name="directory">The directory to search.</param>
 /// <param name="searchPattern">Search pattern to match against files in the directory.</param>
 /// <param name="searchOption">Whether to search the top directory or subdirectories.</param>
 /// <returns>An enumerable of filenames including paths.</returns>
 public IEnumerable <string> EnumerateFiles(string directory, string searchPattern, SearchOption searchOption)
 {
     directory.ThrowIfNullOrWhiteSpace("directory");
     searchPattern.ThrowIfNullOrWhiteSpace("searchPattern");
     searchOption.ThrowIfInvalidEnumerand <SearchOption>("searchOption");
     directory.ThrowIfDirectoryDoesNotExist("directory");
     return(Directory.EnumerateFiles(directory, searchPattern, searchOption));
 }
        /// <summary>
        /// Returns an enumerable collection of files (including full paths) that match a pattern in a specified path,
        /// and optionally searches subdirectories.
        /// </summary>
        /// <param name="directory">The directory to search.</param>
        /// <param name="searchPattern">Search pattern to match against files in the directory.</param>
        /// <param name="searchOption">Whether to search the top directory or subdirectories.</param>
        /// <returns>An enumerable of filenames including paths.</returns>
        public IEnumerable <string> EnumerateFiles(string directory, string searchPattern, SearchOption searchOption)
        {
            directory.ThrowIfNullOrWhiteSpace("directory");
            searchPattern.ThrowIfNullOrWhiteSpace("searchPattern");
            searchOption.ThrowIfInvalidEnumerand <SearchOption>("searchOption");
            if (!DirectoryExists(directory))
            {
                throw new DirectoryNotFoundException("The directory " + directory + " does not exist.");
            }
            Regex regex = MakeRegexFromSearchPattern(searchPattern);

            var files = from filename in Files.Keys
                        where filename.StartsWith(directory) &&
                        filename.Length > directory.Length &&
                        (searchOption == SearchOption.AllDirectories || FileIsDirectlyInDir(filename, directory)) &&
                        (searchPattern == "*" || (regex != null && regex.IsMatch(filename)))
                        select filename;

            return(files);
        }