private static void GetFilesExDirectories_Windows_Internal(string directory, string fileName, int maxDepth, int minDepth, int currentDepth, List <string> files, List <NtQueryDirectoryFileSearcher.FileInformation> fileInfoBuffer, List <NtQueryDirectoryFileSearcher.DirectoryInformation> dirInfoBuffer) { fileInfoBuffer.Clear(); dirInfoBuffer.Clear(); // We always need to query because we need directories. NtQueryDirectoryFileSearcher.TryGetDirectoryContents(directory, fileInfoBuffer, dirInfoBuffer); if (currentDepth >= minDepth - 1 && currentDepth < maxDepth) { foreach (var fileInfo in fileInfoBuffer) { if (fileInfo.FileName.Equals(fileName, StringComparison.OrdinalIgnoreCase)) { files.Add(Path.Combine(fileInfo.DirectoryPath, fileInfo.FileName)); } } } if (currentDepth + 1 >= maxDepth) { return; } foreach (var subdir in dirInfoBuffer.ToArray()) { GetFilesExDirectories_Windows_Internal(subdir.FullPath, fileName, maxDepth, minDepth, currentDepth + 1, files, fileInfoBuffer, dirInfoBuffer); } }
/// <summary> /// Gets all files in a given directory, accelerated for Windows platform. /// </summary> /// <param name="path">The path to get files from.</param> /// <param name="fileName">Pattern to search.</param> public static string[] GetFilesInDirectory(string path, string fileName) { if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { return(Directory.GetFiles(path, fileName, SearchOption.TopDirectoryOnly)); } #pragma warning disable CA1416 // Validate platform compatibility var files = new List <NtQueryDirectoryFileSearcher.FileInformation>(); var directories = new List <NtQueryDirectoryFileSearcher.DirectoryInformation>(); if (!NtQueryDirectoryFileSearcher.TryGetDirectoryContents(path, files, directories)) { return(Directory.GetFiles(path, fileName, SearchOption.TopDirectoryOnly)); } var filePaths = new List <string>(files.Count); foreach (var file in files) { if (file.FileName.Equals(fileName, StringComparison.OrdinalIgnoreCase)) { filePaths.Add(Path.Combine(file.DirectoryPath, file.FileName)); } } #pragma warning restore CA1416 return(filePaths.ToArray()); }