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

C# 获取根目录中文件数组的最有效方法(如果存在),c#,linux,mono,C#,Linux,Mono,我想(递归地)获取linux操作系统根目录/中的所有文件。 我正在使用以下代码 var files = System.IO.Directory.GetFiles("/", "*", SearchOption.AllDirectories); 但是它花费了太多的时间,这使得我的代码效率低下。有没有更有效的方法递归查找文件 我想到了答案,但还是要比System.IO.Directory.GetFiles()花费更多的时间。我认为Matthew Watson是对的,因为光盘的缘故,无论你做什么都会工

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

var files = System.IO.Directory.GetFiles("/", "*", SearchOption.AllDirectories);
但是它花费了太多的时间,这使得我的代码效率低下。有没有更有效的方法递归查找文件


我想到了答案,但还是要比
System.IO.Directory.GetFiles()

花费更多的时间。我认为Matthew Watson是对的,因为光盘的缘故,无论你做什么都会工作得很慢。我唯一想做的就是平行进行。若您在等待结果时还有其他事情要做,那个么异步可能是一个不错的选择

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);
        });
    }

    }
}
使用系统;
使用System.Threading.Tasks;
使用System.IO;
使用System.Collections.Concurrent;
名称空间测试
{
班级计划
{
静态void Main(字符串[]参数)
{
GetFilesOnRoot(“*”);
Console.ReadLine();
}
私有静态并发包文件包;
私有静态void GetFilesOnRoot(字符串筛选器)
{
FilesBag=新的ConcurrentBag();
DirectoryInfo dirRoot=新的DirectoryInfo(“/”);
GetDirTree(dirRoot,“*”);
}
私有静态void GetDirTree(DirectoryInfo dr,字符串过滤器)
{
FileInfo[]files=null;
DirectoryInfo[]subDirs=null;
尝试
{
files=dr.GetFiles(filter+“*”);
}
捕获(异常){}
如果(文件!=null)
{
Parallel.ForEach(files,(FileInfo项)=>{FilesBag.Add(item.Name);});
subDirs=dr.GetDirectories();
Parallel.ForEach(subDirs,(DirectoryInfo项)=>{GetDirTree(项,过滤器);});
}
}
公共静态异步任务GetFilesOnRootAsync(字符串筛选器)
{
等待任务。运行(()=>{
GetFilesOnRoot(过滤器);
});
}
}
}

不要使用
GetFiles
,而是使用
EnumerateFiles
在结果可用时对其进行流式处理。它比GetFiles快吗?如果没有,那么有异步方式吗?没有,它同样慢。但是,如果您使用类似于
foreach(文件中的字符串文件)
,则不必等到搜索了整个驱动器后再启动loop@CamiloTerevinto谢谢你的搜索选项。所有目录将使它返回整个磁盘上的所有文件。那会很慢的。。。当它试图枚举您没有访问权限的内容时,也可能抛出异常。