/// <summary> /// Finds all files which are valid to the mask <paramref name="filemask"/> in the path /// <paramref name="directory"/> and all subdirectories /// (if <paramref name="searchSubdirectories"/> is true). /// If <paramref name="ignoreHidden"/> is true, hidden files and folders are ignored. /// </summary> static IEnumerable<FileName> SearchDirectoryInternal(string directory, string filemask, bool searchSubdirectories, bool ignoreHidden) { // If Directory.GetFiles() searches the 8.3 name as well as the full name so if the filemask is // "*.xpt" it will return "Template.xpt~" bool isExtMatch = filemask != null && Regex.IsMatch(filemask, @"^\*\.[\w\d_]{3}$"); string ext = null; if (isExtMatch) ext = filemask.Substring(1); IEnumerable<string> dir = new[] { directory }; if (searchSubdirectories) dir = dir.Flatten( d => { try { if (ignoreHidden) return Directory.EnumerateDirectories(d).Where(IsNotHidden); else return Directory.EnumerateDirectories(d); } catch (UnauthorizedAccessException) { return new string[0]; } }); foreach (string d in dir) { IEnumerable<string> files; try { files = Directory.EnumerateFiles(d, filemask); } catch (UnauthorizedAccessException) { continue; } foreach (string f in files) { if (ext != null && !f.EndsWith(ext, StringComparison.OrdinalIgnoreCase)) continue; // file extension didn't match if (!ignoreHidden || IsNotHidden(f)) yield return new FileName(f); } } }
/// <summary> /// Finds all files which are valid to the mask <paramref name="filemask"/> in the path /// <paramref name="directory"/> and all subdirectories /// (if <paramref name="searchSubdirectories"/> is true). /// If <paramref name="ignoreHidden"/> is true, hidden files and folders are ignored. /// </summary> static IEnumerable<FileName> SearchDirectoryInternal(string directory, string filemask, bool searchSubdirectories, bool ignoreHidden) { // If Directory.GetFiles() searches the 8.3 name as well as the full name so if the filemask is // "*.xpt" it will return "Template.xpt~" bool isExtMatch = Regex.IsMatch(filemask, @"^\*\..{3}$"); string ext = null; if (isExtMatch) ext = filemask.Remove(0,1); string[] empty = new string[0]; IEnumerable<string> dir = new[] { directory }; if (searchSubdirectories) dir = dir.Flatten( d => { try { if (ignoreHidden) return Directory.EnumerateDirectories(d).Where(child => IsNotHidden(child)); else return Directory.EnumerateDirectories(d); } catch (UnauthorizedAccessException) { return empty; } }); foreach (string d in dir) { IEnumerable<string> files; try { files = Directory.EnumerateFiles(d, filemask); } catch (UnauthorizedAccessException) { continue; } foreach (string f in files) { if (!ignoreHidden || IsNotHidden(f)) yield return new FileName(f); } } }