Рекурсивный поиск файлов в .net
-
22-07-2019 - |
Вопрос
Мне нужно найти диск (C:, D:и т. д.) для определенного типа файла (расширение, например .xml, .csv, .xls).Как мне выполнить рекурсивный поиск, чтобы зациклить все каталоги и внутренние каталоги и вернуть полный путь к файлам?или где я могу получить информацию об этом?
VB.NET или С#
Спасибо
Изменить ~ Я сталкиваюсь с некоторыми ошибками, такими как невозможность доступа к системному тому, отказ в доступе и т. д.Кто-нибудь знает, где я могу увидеть небольшой код реализации поиска файлов?Мне просто нужно выполнить поиск на выбранном диске и вернуть полный путь к типу файлов для всех найденных файлов.
Решение
Как насчет этого?Он позволяет избежать исключений, часто вызываемых встроенным рекурсивным поиском (т.вы получаете отказ в доступе к одной папке, и весь ваш поиск прекращается) и лениво оценивается (т.е.он возвращает результаты, как только их находит, вместо буферизации 2000 результатов).Ленивое поведение позволяет создавать адаптивные пользовательские интерфейсы и т. д., а также хорошо работает с LINQ (особенно First()
, Take()
, и т. д).
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
static class Program { // formatted for vertical space
static void Main() {
foreach (string match in Search("c:\\", "*.xml")) {
Console.WriteLine(match);
}
}
static IEnumerable<string> Search(string root, string searchPattern) {
Queue<string> dirs = new Queue<string>();
dirs.Enqueue(root);
while (dirs.Count > 0) {
string dir = dirs.Dequeue();
// files
string[] paths = null;
try {
paths = Directory.GetFiles(dir, searchPattern);
} catch { } // swallow
if (paths != null && paths.Length > 0) {
foreach (string file in paths) {
yield return file;
}
}
// sub-directories
paths = null;
try {
paths = Directory.GetDirectories(dir);
} catch { } // swallow
if (paths != null && paths.Length > 0) {
foreach (string subDir in paths) {
dirs.Enqueue(subDir);
}
}
}
}
}
Другие советы
System.IO.Directory.GetFiles(@"c:\", "*.xml", SearchOption.AllDirectories);
Похоже на вспоминает библиотека - означает записьурсив лс - теперь есть чистая реализация .NET.я просто почитай об этом у доктора Добба.
Будет использоваться как:
using Recls;
using System;
static class Program { // formatted for vertical space
static void Main() {
foreach(IEntry e in FileSearcher.Search(@"c:\", "*.xml|*.csv|*.xls")) {
Console.WriteLine(e.Path);
}
}