Вопрос

Мне нужно найти диск (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);
        }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top