Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Рекурсивный поиск файлов


Автор: Softaz 26.3.2006, 23:07
Как реализовать? Нужно получить путь+имя файла.
Нашел http://forum.vingrad.ru/index.php?showtopic=68472&unread=1&hl=%D0%BF%D0%BE%D0%B8%D1%81%D0%BA
Там рекурсии нет

Есть функция FindInFiles для поиска в файлах (конечно, малость не то), параметром которой можно указать рекурсивный поиск.
Только она возвращает _сразу_ весь массив имен, а не сразу как найдет следующий файл.
То есть сначала она найдет все файлы, скажем на диске C:\, и только потом можнос ними работать smile
Плюс ко всему, если возникает ошибка доступа к файлу, то, соответственно, массива не будет smile
Т.о. желательно получать имя файла _сразу_ после его нахождения, а не готовый массив после нахождения всех 100000 файлов.

Использование DllImport и API-функций FindFirst, FindNext также неприемлемо.

Автор: Void 26.3.2006, 23:18
Softaz, этот вопрос неоднократно всплывал на RSDN, и в итоге, сколько я помню, пришли к выводу, что если надо получать файлы поочередно, то без WinAPI не обойтись.

Автор: mr.DUDA 27.3.2006, 09:40
Не понимаю, чем не подходит DirectoryInfo и FileInfo ?

Автор: Softaz 27.3.2006, 18:13
Вот:

Код

public void FindInDir(DirectoryInfo dir, string pattern, bool recursive) 
{
    foreach (FileInfo file in dir.GetFiles(pattern)) 
    {
        ListBox1.Items.Add(file.FullName);
    }

    if (recursive) 
    {
        foreach (DirectoryInfo subdir in dir.GetDirectories()) 
        {
            this.FindInDir(subdir,pattern,recursive);
        }
    }
}

public void FindFiles(string dir, string pattern) 
{
    this.FindInDir(new DirectoryInfo(dir),pattern,true);
}

Автор: Void 27.3.2006, 18:15
mr.DUDA,
Цитата

Т.о. желательно получать имя файла _сразу_ после его нахождения, а не готовый массив после нахождения всех 100000 файлов.

А так да, DirectoryInfo.GetFiles.
Добавлено @ 18:21
Кстати, внешний интерфейс к рекурсивному поиску можно реализовать в виде итератора. Тогда отпадет необходимость возвращать массив.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)