C# Поиск файла с известным именем с учетом всех поддиректорий

Рейтинг: 2Ответов: 2Опубликовано: 26.04.2015

День добрый, помогите написать код. Нужно найти файл (известно его полное имя) с учетом всех поддиректорий. Вот то, что сделал я, но он не работает! Точнее работает, но он сканирует только папку Program Files (x86), но он не сканирует поддиректории и т.д.

string[] findFiles = System.IO.Directory.GetFiles(@"C:\Program Files (x86)", "Log.txt", System.IO.SearchOption.AllDirectories);
foreach (string file in findFiles)
{
    MessageBox.Show(file);
}

Ответы

▲ 3

Поддиректории приведённый код сканировать должен. В нём другая проблема - как только он встретит папку, к которой нет доступа, он грохнется и больше ничего сканировать не будет. Пожтому надо самому писать рекурсивный алгоритм и обрабатывать исключения, всязанные с правами доступа.

http://bbs.vbstreets.ru/viewtopic.php?f=2&t=44440
http://www.cyberforum.ru/csharp-beginners/thread957151.html

▲ 3

Без прав админа поиск скорее всего упадет на одной из папок из-за проблем с правами доступа. Запускайте под админом. Или попробуйте рекурсивный поиск с глушением всех ошибок, как предложил @Qwertiy. Папки без прав доступа к ним будут пропущены:

public static IEnumerable<string> EnumerateAllFiles(string path, string pattern)
{ 
    IEnumerable<string> files = null;
    try { files = Directory.EnumerateFiles(path, pattern); }
    catch {}

    if (files != null)
    {
        foreach (var file in files) yield return file;
    }

    IEnumerable<string> directories = null;
    try { directories = Directory.EnumerateDirectories(path); }
    catch { }

    if (directories != null)
    {
        foreach (var file in directories.SelectMany(d => EnumerateAllFiles(d, pattern)))
        {
            yield return file;
        }
    }
}