Как проверить, существует ли тип файлов в определенной папке определенного диска и вернуть только путь к каталогу за меньшее время в C#

Я хочу найти все файлы документов с диска D. Я написал следующий код, но это слишком много времени. Также из-за большего количества времени, затрачиваемого на получение данных, это дает мне исключение. Чтобы минимизировать время, я просто хочу проверить вот так:

даже если в этой папке существует один из типов файлов -> вернуть путь к папке

так что ему не нужно проверять все типы файлов в этом же примере папки:-

если C:\Program Files\Notepad++ имеет readme.txt и другие текстовые файлы. В тот момент, когда он обнаруживает первый текстовый файл в этой папке, он должен вернуть: C:\Program Files\Notepad++

Код, который я использовал в моем файле

 List<string> mediaExtensions = new List<string>{"txt", "pdf"};
    List<string> filesFound = new List<string>();

    void DirSearch(string sDir) 
    {
       foreach (string d in Directory.GetDirectories(sDir)) 
       {
        foreach (string f in Directory.GetFiles(d, "*.*")) 
        {
            if(mediaExtensions.Contains(Path.GetExtension(f).ToLower()))
               filesFound.Add(f);
        }
        DirSearch(d);
       }
    }

Обновление 1: проверка этой ссылки дала мне идею рекурсии и игнорирования файлов, но не минимизировала время, затрачиваемое на поиск файлов.

Update2:- В приведенном выше коде, который я использовал if(mediaExtensions.Contains(Path.GetExtension(f).ToLower())) Я не получаю никакого значения, даже если в папке есть файлы

4 ответа

Первое решение: (.Net 4.0)
Это может немного ускорить процесс:

    DirectoryInfo dirInfo = new DirectoryInfo(myBaseDirectory);
    return dirInfo.EnumerateDirectories()
           .AsParallel()
           .SelectMany(di => di.EnumerateFiles("*.*", SearchOption.AllDirectories));
}

Второе решение: (.Net 3.5 и 4.0)
Если это не помогает, проверьте Faster Directory Enumerator на основе функции WinAPI

Источники: http://www.codeproject.com/Articles/38959/A-Faster-Directory-Enumerator
Функция Win Api: https://msdn.microsoft.com/en-us/library/aa364428%28v=vs.85%29.aspx

Вы можете использовать Directory.GetFiles() метод для поиска файлов рекурсивно. Проверьте параметры, вы можете адаптировать их под свои нужды, не просматривая каталоги самостоятельно:

https://msdn.microsoft.com/en-us/library/ms143316.aspx

Использовать этот:

foreach (string f in Directory.GetFiles(d, "*.txt")) 
{
    // return ".txt file found in d
List<string> mediaExtensions = new List<string>{"txt", "pdf"};
List<string> filesFound = new List<string>();

void DirSearch(string sDir) 
{
   foreach (string d in Directory.GetDirectories(sDir)) 
   {
    foreach (string f in Directory.GetFiles(d, "*.*")) 
    {
        if(mediaExtensions.Contains(Path.GetExtension(f).ToLower()))
           filesFound.Add(f);
           //you said you also need the path of the directory, add it from here
           break;
    }
    DirSearch(d);
   }
}

Когда вы добавляете аргумент f, попробуйте также добавить d из внешнего foreach, ваше требование состояло в том, чтобы добавить папку с хотя бы одним файлом с желаемым расширением.

РЕДАКТИРОВАТЬ 1

Когда вы сталкиваетесь с документами и настройками, вы должны получить к нему доступ, используя

var mydocumentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
Другие вопросы по тегам