Is there a faster way than this to find all the files in a directory and all sub directories?

前端 未结 16 1420
盖世英雄少女心
盖世英雄少女心 2020-11-29 17:49

I\'m writing a program that needs to search a directory and all its sub directories for files that have a certain extension. This is going to be used both on a local, and a

16条回答
  •  执念已碎
    2020-11-29 18:04

    I had the same problem. Here is my attempt which is a lot faster than calling Directory.EnumerateFiles, Directory.EnumerateDirectories or Directory.EnumerateFileSystemEntries recursive:

    public static IEnumerable EnumerateDirectoriesRecursive(string directoryPath)
    {
        return EnumerateFileSystemEntries(directoryPath).Where(e => e.isDirectory).Select(e => e.EntryPath);
    }
    
    public static IEnumerable EnumerateFilesRecursive(string directoryPath)
    {
        return EnumerateFileSystemEntries(directoryPath).Where(e => !e.isDirectory).Select(e => e.EntryPath);
    }
    
    public static IEnumerable<(string EntryPath, bool isDirectory)> EnumerateFileSystemEntries(string directoryPath)
    {
        Stack directoryStack = new Stack(new[] { directoryPath });
    
        while (directoryStack.Any())
        {
            foreach (string fileSystemEntry in Directory.EnumerateFileSystemEntries(directoryStack.Pop()))
            {
                bool isDirectory = (File.GetAttributes(fileSystemEntry) & (FileAttributes.Directory | FileAttributes.ReparsePoint)) == FileAttributes.Directory;
    
                yield return (fileSystemEntry, isDirectory);
    
                if (isDirectory)
                    directoryStack.Push(fileSystemEntry);
            }
        }
    }
    

    You can modify the code to search for specific files or directories easily.

    Regards

提交回复
热议问题