Рекурсивный поиск файлов в .net - PullRequest
19 голосов
/ 13 января 2009

Мне нужно найти на диске (C :, D: и т. Д.) Определенный тип файла (расширение, например .xml, .csv, .xls). Как мне выполнить рекурсивный поиск, чтобы зациклить все каталоги и внутренние каталоги и вернуть полный путь к файлам? или где я могу получить информацию об этом?

VB.NET или C #

Спасибо

Редактировать ~ Я сталкиваюсь с некоторыми ошибками, такими как невозможность доступа к системному тому, доступ запрещен и т. Д. Кто-нибудь знает, где я могу увидеть некоторый фрагмент кода при осуществлении поиска файлов? Мне просто нужно найти выбранный диск и вернуть полный путь к типу файла для всех найденных файлов.

Ответы [ 3 ]

53 голосов
/ 13 января 2009
System.IO.Directory.GetFiles(@"c:\", "*.xml", SearchOption.AllDirectories);
21 голосов
/ 13 января 2009

Как насчет этого? Он избегает исключения, часто вызываемого встроенным рекурсивным поиском (т.е. вы получаете отказ в доступе к одной папке, и весь ваш поиск умирает), и лениво оценивается (т.е. он возвращает результаты, как только он их находит, а не буферизация 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);
                }
            }
        }
    }
}
5 голосов
/ 20 ноября 2009

Это похоже на библиотеку recls - расшифровывается как rec ursive ls - теперь имеет чистую реализацию .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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...