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 № 1Eu 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();
}