/ / c # pesquisa recursiva para verificar se há uma extensão de arquivo - c #, arquivo, pesquisa, recursão

c # busca recursiva para verificar se há uma extensão de arquivo - c #, arquivo, pesquisa, recursão

Quero verificar se um arquivo no diretório que eu passo tem uma extensão específica.

 public static bool ProcessDirectory(string targetDirectory)
{
// Process the list of files found in the directory.
string[] fileEntries = System.IO.Directory.GetFiles(targetDirectory);
foreach (string fileName in fileEntries)
if (System.IO.Path.GetExtension(fileName).ToLower().Contains(pattern))
return true;

// Recurse into subdirectories of this directory.
string[] subdirectoryEntries = System.IO.Directory.GetDirectories(targetDirectory);
foreach (string subdirectory in subdirectoryEntries)
return ProcessDirectory(subdirectory);

return false;
}

chamada de:

bool foundPattern = false;
//recursive search - based on search pattern
if (System.IO.File.Exists(myDirectory) && System.IO.Path.GetExtension(myDirectory).Contains(pattern))
{
// This path is a file
foundPattern = true;
}
else if (System.IO.Directory.Exists(myDirectory))
{
// This path is a directory
foundPattern = ProcessDirectory(myDirectory);
}

O problema é que eu não obtenho alguns resultados (eu recebofalse mesmo quando há arquivos com extensão .xzz, supondo que eu solicite a extensão .x no padrão de pesquisa - às vezes, sou verdadeiro, às vezes, falso).

Se eu avançar, parece que estou olhando para diretórios e acessando-os recursivamente e examinando arquivos ...

Mas isso não acontece.

Respostas:

2 para resposta № 1

Eu acho que há um bug no seu código:

// Recurse into subdirectories of this directory.
string[] subdirectoryEntries = System.IO.Directory.GetDirectories(targetDirectory);
foreach (string subdirectory in subdirectoryEntries)
return ProcessDirectory(subdirectory);

Deve ser algo como:

// Recurse into subdirectories of this directory.
string[] subdirectoryEntries = System.IO.Directory.GetDirectories(targetDirectory);
foreach (string subdirectory in subdirectoryEntries)
if (ProcessDirectory(subdirectory))
return true;

Caso contrário, você retornará apenas os resultados para um único subdiretório. É o mesmo tipo de loop que você tem no início de sua função. Você faz certo da primeira vez.


3 para resposta № 2

O que você quer fazer pode ser facilmente feito com isso

string path = @"C:temp";
string extension = "*.txt";
var files = Directory.GetFiles(path, extension);

//or recursivly
var files = Directory.GetFiles(path, extension, SearchOption.AllDirectories);

No seu caso:

public static bool ProcessDirectory(string startPath, string pattern)
{
return Directory.GetFiles(startPath, pattern, SearchOption.AllDirectories).Any();
}