Подтвердить что ты не робот

Рекурсивный поиск файлов в .net

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

VB.NET или С#

Спасибо

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

4b9b3361

Ответ 1

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

Ответ 2

System.IO.Directory.GetFiles(@"c:\", "*.xml", SearchOption.AllDirectories);

Ответ 3

Похоже, что библиотека recls - означает рекурсивный ls - теперь имеет чистая реализация .NET. Я просто читал об этом в Dr Dobb's.

Будет использоваться как:

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);
        }
    }