在根目录中获取文件数组的最有效方法(如果存在)

Most efficient way (if exists) to get array of files in root

我想(递归地)获取 linux OS 的根目录 / 中的所有文件。 我正在使用以下代码

var files = System.IO.Directory.GetFiles("/", "*", SearchOption.AllDirectories);

但是它花费了太多时间,这使得我的代码效率低下。有什么方法可以更有效地递归查找文件吗?

我想到了 this 答案,但它又比 System.IO.Directory.GetFiles()

花费了更多时间

我认为 Matthew Watson 是对的,因为有光盘,无论你做什么都会很慢。我唯一想做的就是并行进行。如果您在等待结果时有其他事情要做,也许 async 是一个不错的选择。

using System;
using System.Threading.Tasks;
using System.IO;
using System.Collections.Concurrent;

namespace Test
{
    class Program
    {

    static void Main(string[] args)
    {
        GetFilesOnRoot("*");            
        Console.ReadLine();
    }

    private static ConcurrentBag<string> FilesBag;
    private static void GetFilesOnRoot(string filter)
    {
        FilesBag = new ConcurrentBag<string>();
        DirectoryInfo dirRoot = new DirectoryInfo("/");
        GetDirTree(dirRoot, "*");
    }

    private static void GetDirTree(DirectoryInfo dr, string filter)
    {
        FileInfo[] files = null;
        DirectoryInfo[] subDirs = null;
        try
        {
        files = dr.GetFiles(filter + ".*");
        }
        catch(Exception) { }        

        if (files != null)
        {
        Parallel.ForEach(files, (FileInfo item) => { FilesBag.Add(item.Name); });
        subDirs = dr.GetDirectories();
        Parallel.ForEach(subDirs, (DirectoryInfo item) => { GetDirTree(item,filter); });
        }
    }

    public static async Task GetFilesOnRootAsync(string filter)
    {
        await Task.Run(() => {
        GetFilesOnRoot(filter);
        });
    }

    }
}