Как проверить, существует ли тип файлов в определенной папке определенного диска и вернуть только путь к каталогу за меньшее время в 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()
метод для поиска файлов рекурсивно. Проверьте параметры, вы можете адаптировать их под свои нужды, не просматривая каталоги самостоятельно:
Использовать этот:
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)