Pergunta

Eu preciso procurar uma unidade (C :, D: etc) para um tipo de arquivo partuicular (extensão como .xml, .csv, .xls). Como faço para pré-formas uma pesquisa recursiva para repetir todos os diretórios e diretórios internos e retornar o caminho completo de onde o arquivo (s) são? ou onde posso obter informações sobre isso?

VB.NET ou C #

Graças

Editar ~ Eu estou correndo em alguns erros como incapaz de acesso volume do sistema de acesso negado etc. Alguém sabe onde eu posso ver algum código smaple na implementação de uma pesquisa de arquivo? Eu só preciso procurar uma unidade seleccionada e voltar ao caminho completo do tipo de arquivo para todos os arquivos encontrados.

Foi útil?

Solução

Como sobre isso? Ele evita a exceção muitas vezes jogado pela pesquisa recursiva embutido (ou seja, você obter acesso negado para uma única pasta, e suas matrizes de busca inteiros), e é preguiçosamente avaliadas (ou seja, ele retorna resultados assim que ele encontra-los, ao invés de tamponamento 2000 resultados). O comportamento preguiçoso permite que você construa responsivo UIs etc, e também funciona bem com LINQ (especialmente First(), Take(), etc).

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

Outras dicas

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

Parece que o recls biblioteca - representa rec ursive ls - agora tem um pura .NET implementação . Eu só ler sobre ele em do Dr. Dobb.

seria usado como:

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);
        }
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top