Exemple #1
0
    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);
        }
    }
Exemple #2
0
    /// <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());
    }