Самый эффективный способ (если есть) получить массив файлов в корне - PullRequest
0 голосов
/ 16 октября 2018

Я хочу получить все файлы (рекурсивно) в моем корневом каталоге / ОС Linux.Я использую следующий код

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

Но это занимает так много времени, что делает мой код неэффективным.Есть ли способ рекурсивного поиска файлов гораздо более эффективным способом?

Я думал о этом ответе, но опять же это занимает даже больше времени, чем System.IO.Directory.GetFiles()

1 Ответ

0 голосов
/ 16 октября 2018

Я думаю, что Мэтью Уотсон прав, что бы вы ни делали, это будет работать медленно из-за диска.Единственное, что я бы попытался сделать, это сделать это параллельно.Если у вас есть другие дела во время ожидания результата, возможно, 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);
        });
    }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...